MySQL視圖之我見

最近項目上有使用到數(shù)據(jù)庫視圖坪圾,覺得需要把相關(guān)的知識整理一下方便學(xué)習(xí)拯啦。今天先簡單介紹一下視圖的概念和一些基本原理。

什么是數(shù)據(jù)庫視圖

數(shù)據(jù)庫視圖的創(chuàng)建是基于SQL SELECT queryJOIN的。視圖和表很相似吵聪,它也包含行和列,所以可以直接對它進行查詢操作兼雄。另外大多數(shù)的數(shù)據(jù)庫同樣允許進行UPADTE操作吟逝,但必須滿足一定的條件。視圖的數(shù)據(jù)結(jié)構(gòu)如圖:

image

我們需要理解赦肋,數(shù)據(jù)庫并沒有存儲視圖所關(guān)聯(lián)的數(shù)據(jù)块攒,存儲的只是視圖的定義也就是相應(yīng)的SQL SELECT and JOIN

那么使用數(shù)據(jù)庫視圖到底有哪些優(yōu)勢呢:

  • 視圖可以簡化你的復(fù)雜查詢:視圖的定義是基于一個查詢聲明佃乘,這個查詢聲明可能關(guān)聯(lián)了很多底層表囱井。我們可以使用視圖向數(shù)據(jù)庫的使用者或者外部程序隱藏復(fù)雜的底層表關(guān)系。
  • 視圖可以限制特定用戶的數(shù)據(jù)訪問權(quán):有時我們希望隱藏某些表的一些數(shù)據(jù)對一些特定用戶趣避,這時視圖可以很好的幫助我們實現(xiàn)這個功能庞呕。
  • 視圖可以使用可計算的列:我們知道表的列一般都不支持動態(tài)計算,但是視圖的列是支持的程帕。假設(shè)在有一張order_details表住练,其中包含product_numsprice_each兩列,當(dāng)我們需要查詢order總價時我們就需要查詢出結(jié)果后在代碼中進行計算愁拭,如果我們使用視圖的話可以在視圖中添加一列total_price(product_nums*price_each)讲逛。這樣就可以直接查詢出order的總價。
  • 視圖可以幫助我們兼容舊的系統(tǒng):假設(shè)我們擁有一個數(shù)據(jù)中心岭埠,這個數(shù)據(jù)中心被很多的程序在使用妆绞。如果有一天我們決定重新設(shè)計這個數(shù)據(jù)中心以適應(yīng)一些新的業(yè)務(wù)需求,可能需要刪除一些舊的表枫攀,并且創(chuàng)建一些新的表括饶,但是我們并不希望這些變動影響到那些老的程序。那么我們可以創(chuàng)建一些視圖用來適配那些老的程序来涨。

MySQL View

MySQL從5.x版本支持視圖图焰,并且基本符合SQL: 2003標(biāo)準(zhǔn)。
MySQL中執(zhí)行查詢視圖的方式有一下兩種:

  • MySQL會合并輸入的查詢語句和視圖的查詢聲明然后執(zhí)行合并后的語句并返回結(jié)果蹦掐。
  • MySQL會基于視圖的查詢聲明創(chuàng)建一個temporary table, 當(dāng)執(zhí)行查詢語句時會查詢這張temporary table

如果創(chuàng)建視圖的時候并未指定查詢方式技羔,MySQL會默認(rèn)優(yōu)先使用第一種僵闯,但如果視圖的查詢聲明中的SELECT使用了聚合函數(shù)(MIN, MAX, SUM, COUNT, AVG, etc., or DISTINCT, GROUP BY, HAVING, LIMIT, UNION, UNION ALL, subquery.),那么視圖查詢會使用第二種方式藤滥。

Create View

創(chuàng)建MySQL視圖可以使用CREATE VIEW聲明:

CREATE 
   [ALGORITHM = {MERGE  | TEMPTABLE | UNDEFINED}]
VIEW [database_name].[view_name] 
AS
[SELECT  statement]

ALGORITHM:

MySQL有三種視圖執(zhí)行策略, 分別是MERGE, TEMPTABLE, UNDEFINED.

  • 使用MERGE策略鳖粟,MySQL會先將輸入的查詢語句和視圖的聲明語句進行合并,然后執(zhí)行合并后的語句并返回拙绊。但是如果輸入的查詢語句中不允許包含一些聚合函數(shù)如: MIN, MAX, SUM, COUNT, AVG, etc., or DISTINCT, GROUP BY, HAVING, LIMIT, UNION, UNION ALL, subquery向图。同樣如果視圖聲明沒有指向任何數(shù)據(jù)表,也是不允許的标沪。如果出現(xiàn)以上任意情況, MySQL默認(rèn)會使用UNDEFINED策略榄攀。
  • 使用TEMPTABLE策略,MySQL先基于視圖的聲明創(chuàng)建一張temporary table金句,當(dāng)輸入查詢語句時會直接查詢這張temporary table檩赢。由于需要創(chuàng)建temporary table來存儲視圖的結(jié)果集, TEMPTABLE的效率要比MERGE策略低,另外使用temporary table策略的視圖是無法更新的违寞。
  • 使用UNDEFINED策略贞瞒,如果創(chuàng)建視圖的時候不指定策略,MySQL默認(rèn)使用此策略趁曼。UNDEFINED策略會自動選擇使用上述兩種策略中的一個军浆,優(yōu)先選擇MERGE策略,無法使用則轉(zhuǎn)為TEMPTABLE策略彰阴。

View Name

視圖的名稱瘾敢,在MySQL中視圖名和表名使用同一命名空間拍冠,這意味這視圖名不能和表名重復(fù)并且要符合表名的命名規(guī)范尿这。

Select Statement

在視圖的查詢聲明中你可以查詢所有數(shù)據(jù)庫中已存在的表的數(shù)據(jù),有以下集中規(guī)則:

  • 查詢聲明可以在WHERE條件中使用子查詢但是不允許在FROM的來源中使用子查詢庆杜。
  • 查詢聲明中不允許引用任何變量射众,包括local variables, user variables, and session variables
  • 查詢聲明中不允許引用prepare statement的參數(shù)晃财。

Note: 查詢聲明的From中可以引用其他視圖

Example

CREATE VIEW customerOrders AS
    SELECT 
        d.orderNumber,
        customerName,
        SUM(quantityOrdered * priceEach) total
    FROM
        orderDetails d
            INNER JOIN
        orders o ON o.orderNumber = d.orderNumber
            INNER JOIN
        customers c ON c.customerNumber = c.customerNumber
    GROUP BY d.orderNumber
    ORDER BY total DESC;
  • 使用子查詢
CREATE VIEW aboveAvgProducts AS
    SELECT 
        productCode, productName, buyPrice
    FROM
        products
    WHERE
        buyPrice > 
 (SELECT 
                AVG(buyPrice)
            FROM
                products)
    ORDER BY buyPrice DESC;

查詢視圖

SELECT * FROM customerOrders;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叨橱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子断盛,更是在濱河造成了極大的恐慌罗洗,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钢猛,死亡現(xiàn)場離奇詭異伙菜,居然都是意外死亡,警方通過查閱死者的電腦和手機命迈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門贩绕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來火的,“玉大人,你說我怎么就攤上這事淑倾×蠛祝” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵娇哆,是天一觀的道長湃累。 經(jīng)常有香客問我,道長迂尝,這世上最難降的妖魔是什么脱茉? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮垄开,結(jié)果婚禮上琴许,老公的妹妹穿的比我還像新娘。我一直安慰自己溉躲,他們只是感情好榜田,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锻梳,像睡著了一般箭券。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疑枯,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天辩块,我揣著相機與錄音,去河邊找鬼荆永。 笑死废亭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的具钥。 我是一名探鬼主播豆村,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骂删!你這毒婦竟也來了掌动?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宁玫,失蹤者是張志新(化名)和其女友劉穎粗恢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欧瘪,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡眷射,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凭迹。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡罚屋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗅绸,到底是詐尸還是另有隱情脾猛,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布鱼鸠,位于F島的核電站猛拴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚀狰。R本人自食惡果不足惜愉昆,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望麻蹋。 院中可真熱鬧跛溉,春花似錦、人聲如沸扮授。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刹勃。三九已至堪侯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荔仁,已是汗流浹背伍宦。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乏梁,地道東北人次洼。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像掌呜,于是被迫代替她去往敵國和親滓玖。 傳聞我的和親對象是個殘疾皇子坪哄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容