什麼是視圖
視圖是虛擬的表,與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢;
輸入: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