基礎-使用視圖(CREATE VIEW....AS....)

什麼是視圖
視圖是虛擬的表,與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢;

輸入:SELECT  cust_name,cust_contact

          FROM    customers,orders,orderitems

          WHERE  customers.cust_id = orders.cust_id
              AND  orderitems.order_num = orders.order_num

              AND  prod_id = 'TNT2';

現在,假如可以把整個查詢包裝成一個名爲productcustomers的虛擬表,則可以把上述查詢語句改爲:

輸入:SELECT  cust_name,cust_contact

          FROM    productcustomers

          WHERE  prod_id = 'TNT2';

這就是視圖的作用,productcustomers是一個視圖,不包含表中應該有的任何列或數據,它包含的是一個SQL查詢;

爲什麼使用視圖
1.重用SQL語句;

2.簡化複雜的SQL操作。在編寫查詢後,可以方便地重用它而不必知道它的基本查詢細節;

3.使用表的組成部分而不是整個表;

4.保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個表的訪問權限;

5.更改數據格式和表示。視圖可返回與底層表的表示和格式不同的數據;

視圖創建後,像表一樣使用它即可;可以對視圖執行SELECT操作,過濾和排序數據,將視圖聯結到其他視圖或表,甚至能添加和更新數據(添加和更新數據存在某些限制);

重要的是,視圖僅僅是用來查看存儲在別處的數據的一種措施,視圖本身不包含數據,因此它們返回的數據是從其他的表中檢索出來的;在添加或更改這些表中的數據時,視圖將返回更改過的數據;

性能問題:因爲視圖不包含數據,所以每次使用視圖時,都必須處理查詢執行時所需的任一個檢索;如果你用多個聯結和過濾創建了複雜的視圖或者嵌套了視圖,可能會發現性能下降得很厲害;因此,在部署使用了大量視圖的應用前,應該進行測試;

視圖的規則和限制
1.與表一樣,視圖的名字必須唯一,不能和其他的視圖或表的名字相同;

2.沒有說,視圖最多隻能創建多少個,這種說法;

3.爲了創建視圖,必須具有足夠的訪問權限;這些權限通常由數據庫管理人員授予;

4.視圖可以嵌套,即可以利用從其他視圖中檢索數據的查詢來構造一個視圖;

5.ORDER BY可以用在視圖中,但如果從該視圖檢索數據SELECT中也含有ORDER BY,那麼該視圖中的ORDER BY將被覆蓋;

6.視圖不能索引,也不能有關聯的觸發器或默認值;

7.視圖可以和表一起使用。例如,編寫一條聯結表和視圖的SELECT語句;

使用視圖
1.視圖用CREATE VIEW語句來創建;

2.使用SHOW CREATE VIEW viewname;來查看創建視圖的語句;

3.用DROP刪除視圖,其語法爲DROP VIEW viewname;

4.更新視圖時,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW;如果要更新的視圖不存在,則第2條更新語句會創建一個視圖;如果要更新的視圖存在,則第2條更新語句會替換原有視圖;

利用視圖簡化複雜的聯結
視圖的最常見的應用之一是隱藏複雜的SQL,這通常會涉及聯結;

從這個例子可以看出,視圖簡化了複雜SQL語句的使用;利用視圖,可以一次編寫基礎的SQL,然後根據需要多次使用;

用視圖重新格式化檢索出的數據


用視圖過濾不想要的數據
視圖對於應用普通的WHERE子句也很有用,例如, 可以定義customeremaillist視圖,它過濾沒有電子郵件地址的客戶;

WHERE子句與WHERE子句:如果從視圖檢索數據時使用了一條WHERE子句,則兩組子句(一組在視圖中,另一組是傳遞給視圖的)將自動組合;

使用視圖與計算字段
視圖對於簡化計算字段的使用特別有用;

更新視圖
通常,視圖是可更新的(即,可以對它們使用INSERT、UPDATE和DELETE);更新一個視圖將更新其基表(可以回憶一下,視圖本身沒有數據);如果你對視圖增加或刪除行,實際上是對其基表增加或刪除行;

但是,並非所有視圖都是可更新的;基本上可以說,如果MySQL不能正確地確定被更新的基數據,則不允許更新(包括插入和刪除);即如果視圖定義中有以下操作,則不能更新:

1.分組(使用GROUP BY和HAVING):

2.聯結;

3.子查詢;

4.並;

5.聚集函數(Min()、Count()、Sum()等);

6.DISTINCT;

7.導出(計算)列;、

所以,上述的許多例子都是不可更新的;

因爲視圖主要用於數據檢索,一般將視圖用於檢索(SELECT語句)而不用於更新(INSERT、UPDATE和DELETE);

總結
視圖爲虛擬的表。它們包含的不是數據而是根據需要檢索數據的查詢;

視圖提供了一種MySQL的SELECT語句層次的封裝,可用來簡化數據處理以及重新格式化基礎數據或保護基礎數據;
————————————————
版權聲明:本文爲CSDN博主「Iovems」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Regemc/article/details/80641652

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章