視圖

基礎(chǔ)

可以將視圖理解為一個(gè)虛擬表,表中的數(shù)據(jù)就是 SQL 語(yǔ)句從別的表中檢索出來(lái)的尝丐。因此显拜,也可以將視圖理解為對(duì)這些復(fù)雜 SQL 語(yǔ)句的封裝。

使用聯(lián)結(jié)時(shí)爹袁,整個(gè) SQL 語(yǔ)句可能會(huì)寫(xiě)的很長(zhǎng)远荠,非常不利于復(fù)用。利用視圖可一次性編寫(xiě)出基礎(chǔ)的 SQL 語(yǔ)句呢簸,然后根據(jù)需要多次重復(fù)使用矮台。

類似于編程中將某些復(fù)雜功能封裝成函數(shù),然后可以簡(jiǎn)單地調(diào)用根时, 而不需要多次復(fù)制相同的代碼瘦赫。

  1. 視圖對(duì)復(fù)雜的 SQL 語(yǔ)句提供了封裝,為復(fù)用提供了便利條件蛤迎;同時(shí)也控件用戶對(duì)表的訪問(wèn)确虱,保護(hù)了表中的數(shù)據(jù)

  2. 視圖是一個(gè)虛擬表替裆,它可以與表一樣使用校辩,如:可以 SELECT,過(guò)濾和排序辆童,也可以聯(lián)結(jié)到其他表或視圖中宜咒,甚至能增加或更新數(shù)據(jù) —— 不過(guò)有一些限制。

  3. 視圖本身不包含任何數(shù)據(jù)把鉴,它返回的數(shù)據(jù)都是從其他表中檢索出來(lái)的故黑。在修改原表中的數(shù)據(jù)后,通過(guò)視圖檢索出來(lái)的結(jié)果也會(huì)隨之改變庭砍。

  4. 視圖與表一樣场晶,視圖名必須唯一,不能與表名相同怠缸,也不能與其他視圖名相同诗轻。

  5. 視圖的數(shù)據(jù)都是動(dòng)態(tài)查詢,所以如果視圖嵌套過(guò)多揭北,性能可能會(huì)嚴(yán)重下降扳炬。

益處

  1. 對(duì)復(fù)雜SQL的封裝吏颖,簡(jiǎn)化調(diào)用。

  2. 限制對(duì)表的訪問(wèn)鞠柄,保護(hù)表中的數(shù)據(jù)侦高。

  3. 更新數(shù)據(jù)格式和表示。視圖在返回?cái)?shù)據(jù)時(shí)厌杜,可以將表中的數(shù)據(jù)進(jìn)行修改奉呛,并將修改后的數(shù)據(jù)返回給調(diào)用者,而不是表中原本的格式夯尽。


創(chuàng)建

創(chuàng)建視圖用 CREATE VIEW+AS 關(guān)鍵字瞧壮。其中 AS 后面跟的是封裝的 SQL 語(yǔ)句。

SELECT Customers.cust_id,cust_name,cust_email,Orders.[order_num]
FROM Customers,OrderItems,Orders
WHERE OrderItems.[prod_id]= 'BNBG01'
     AND Orders.[order_num]=OrderItems.[order_num] 
     AND Orders.[cust_id]=Customers.[cust_id]  

上述是查詢所有定了 BNBG01 產(chǎn)品的用戶的 cust_id , cust_name , cust_email 以及對(duì)應(yīng)的訂單號(hào)匙握。

如果查詢定過(guò) RGAN01 產(chǎn)品的用戶的信息咆槽,就需要將一堆的聯(lián)結(jié)查詢重新復(fù)制一遍,然后重新運(yùn)行圈纺。

在寫(xiě)程序中秦忿,如此重復(fù)的復(fù)雜的代碼肯定是需要進(jìn)行抽取成單獨(dú)的函數(shù)的,在 sql 中也一樣:它會(huì)將其中共性的部分抽取成視圖蛾娶,而非共性的部分就類似于傳入函數(shù)中的參數(shù)灯谣。如:

CREATE VIEW HasOrderCust AS
    SELECT Customers.cust_id,cust_name,Orders.[order_num],OrderItems.[prod_id]
    FROM Customers,OrderItems,Orders
    WHERE Orders.[order_num]=OrderItems.[order_num] 
        AND Orders.[cust_id]=Customers.[cust_id];

通過(guò) CREATE VIEW+AS 創(chuàng)建了一個(gè)名為 HasOrderCust 的視圖。SELECT 語(yǔ)句定義了這個(gè)視圖中的數(shù)據(jù)來(lái)源:所有有訂單的顧客的 cust_id , cust_name 以及對(duì)應(yīng)的訂單號(hào)蛔琅,prod_id胎许。

這里將最上面的聯(lián)結(jié)查詢中的公共部分給抽取出來(lái)的 —— 視圖中包含了所有有訂單的客戶,想查詢具體定了某個(gè)產(chǎn)品的客戶罗售,直接從該視圖中查詢即可辜窑。這里的具體產(chǎn)品就是要傳入視圖中的參數(shù)。

使用該視圖如下:

SELECT * FROM HasOrderCust WHERE prod_id=‘BR03’;

這里 WHERE 中用到了 prod_id寨躁,因此視圖中必須返回 OrderItems.prod_id穆碎,不然視圖中沒(méi)有該列,WHERE 子句便無(wú)法執(zhí)行职恳。

在執(zhí)行時(shí)惨远,會(huì)將指定的 WHERE 子句添加到視圖中已有的 WHERE 子句中,以便查詢出正確的數(shù)據(jù)话肖。簡(jiǎn)單理解:WHERE 會(huì)從視圖(此時(shí)將視圖當(dāng)作一個(gè)表)中查詢出滿足 WHERE 條件的數(shù)據(jù)。

會(huì)被當(dāng)作條件的列葡幸,必須在視圖中存在 —— 比如上面的 prod_id —— 否則執(zhí)行時(shí)便會(huì)報(bào)錯(cuò)最筒。

這也說(shuō)明了視圖是可以控制外界對(duì)表中數(shù)據(jù)的訪問(wèn)的,比如沒(méi)有 prod_id 列則外界便無(wú)法使用該列蔚叨。

刪除視圖

使用DROP VIEW即可床蜘。

如:

DROP VIEW HasOrderCust;

格式化數(shù)據(jù)

CREATE VIEW T AS
    SELECT cust_address||'('||cust_name||')' AS fullname 
FROM Customers; -- 創(chuàng)建視圖辙培,同時(shí)格式化視圖返回的數(shù)據(jù)

SELECT * FROM T; -- 從視圖中查詢數(shù)據(jù) 

在創(chuàng)建視圖時(shí)對(duì)檢索到的數(shù)據(jù)進(jìn)行格式化,所以通過(guò) SELECT * FROM T 進(jìn)行查詢時(shí)只能得到格式化后的數(shù)據(jù)邢锯,得不到 Customers 表中存儲(chǔ)的原始數(shù)據(jù)扬蕊。這也是視圖保護(hù)表中數(shù)據(jù)的一個(gè)體現(xiàn)。

如果需要多次調(diào)用視圖中格式化后的數(shù)據(jù)丹擎,則會(huì)非常簡(jiǎn)便尾抑,不需要每一次都寫(xiě)列名拼接。


過(guò)濾

CREATE VIEW T  AS
    SELECT cust_email AS fullname 
    FROM Customers WHERE cust_email IS NOT NULL;

該語(yǔ)句會(huì)將所有值不是 null 的 cust_email 組成一個(gè)視圖蒂培。


計(jì)算字段

CREATE VIEW TotalPrice AS
    SELECT order_num,quantity,item_price,quantity*item_price AS total 
    FROM OrderItems; -- 定義視圖

SELECT sum(total),order_num FROM TotalPrice GROUP BY order_num;

第一步創(chuàng)建視圖再愈,并在創(chuàng)建時(shí)為視圖指定了 total 列:該列的值由計(jì)算得到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末护戳,一起剝皮案震驚了整個(gè)濱河市翎冲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌媳荒,老刑警劉巖抗悍,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钳枕,居然都是意外死亡缴渊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人驼修,你說(shuō)我怎么就攤上這事千扔。” “怎么了掘譬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我欣舵,道長(zhǎng),這世上最難降的妖魔是什么缀磕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任缘圈,我火速辦了婚禮,結(jié)果婚禮上袜蚕,老公的妹妹穿的比我還像新娘糟把。我一直安慰自己,他們只是感情好牲剃,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布遣疯。 她就那樣靜靜地躺著,像睡著了一般凿傅。 火紅的嫁衣襯著肌膚如雪缠犀。 梳的紋絲不亂的頭發(fā)上数苫,一...
    開(kāi)封第一講書(shū)人閱讀 52,874評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音辨液,去河邊找鬼虐急。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滔迈,可吹牛的內(nèi)容都是我干的止吁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亡鼠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赏殃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起间涵,我...
    開(kāi)封第一講書(shū)人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仁热,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后勾哩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抗蠢,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年思劳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迅矛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潜叛,死狀恐怖秽褒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情威兜,我是刑警寧澤销斟,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站椒舵,受9級(jí)特大地震影響蚂踊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笔宿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一犁钟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泼橘,春花似錦涝动、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春昔穴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背提前。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工吗货, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狈网。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓宙搬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拓哺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勇垛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361