什麼時候可使用視圖
- 重用SQL語句
- 簡化複雜SQL操作。編寫查詢後,可以方便地重用它而不必知道它基本查詢細節。
- 使用表的組成部分而不是整個表。
- 保護數據。可以給用戶授予表的特定部份的訪問權限而不是整個表的。
更改數據格式和表示。視圖可返回與底層表的表示和格式不同的數據。
在視圖創建後,可用與表基本相同的方式利用它們。可對視圖執行SELECT操作,過濾和排序數據,將視圖聯結到其他視圖或表,甚至能添加和更新數據(但會有限制)。
重要的是知道視圖僅僅是用來查看存儲在別處的數據的一種設施。視圖本身不包含數據,因此它們返回的數據是從其他表中檢索出來的。在添加或更改這些表中的數據時,視圖將返回改變過的數據。
性能問題:
視圖不包含數據,所以每次使用視圖時,都必須處理查詢執行時所需的任一個檢索。如果你用多個聯結和過濾創建了複雜的視圖或者嵌套了視圖。可能會發現性能下降的很厲害。因此,在部署使用了大量視圖的應用前,應進行測試。
視圖的規則和限制
- 與表一樣,視圖必須唯一命名(不能給視圖取與別的視圖或者表相同的名字)
- 對於可以創建的視圖數目沒有限制。
- 爲了創建視圖,必須有足夠訪問權限。限制通常由數據庫管理人員授予。
- 視圖可以嵌套,即可以利用從其他視圖中檢索數據的查詢來構造一個視圖。
- ORDER BY可以用在視圖中,但如果從該視圖檢索數據的SELECT語句中也含有ORDER BY,那麼視圖中的ORDER BY將被覆蓋。
- 視圖不能索引,也不能有關聯的觸發器或默認值。
- 視圖可以和表一起使用。例如,編寫一條聯結表和視圖的SELECT一起使用。
使用視圖
- 視圖用CREATE VIEW語句來創建
- 使用SHOW CREATE VIEW viewname; 來查看創建視圖的語句。
- 用DROP刪除視圖,其語法爲DROP VIEW viewname;
- 更新視圖時,可先用DROP再用CREATE,也可直接用CREATE OR REPLACE VIEW。(如果要更新的視圖不存在,則第二條更新語句會創建一個視圖;如果要更新的視圖存在,則第二條更新語句會替換原有視圖)
利用視圖簡化負責的聯結
CREATE VIEW productcustomers AS
SELECT cust_name,cust_contact,prod_id
FROM customers cu,orders o,orderitems ot
WHERE cu.cust_id=o.cust_id
AND ot.order_num=o.order_num;
這條語句創建一個名爲productcustomers的視圖,它聯結三個表,返回已訂購了任意產品的所有客戶的列表。如果執行
SELECT * FROM productcustomers,將列出訂購了任意產品的客戶。
用視圖重新格式化檢索出的數據
SELECT CONCAT(RTRIM(vend_name),' (',RTRIM(vend_country),')')
AS vend_title
FROM vendors
ORDER BY vend_name
現在,假如我們經常需要這個格式的結果,不必每次需要執行時執行聯結,創建一個視圖,每次需要時使用它即可。
視圖:
#創建視圖
CREATE VIEW vendorlocations AS
SELECT CONCAT(RTRIM(vend_name),' (',RTRIM(vend_country),')')
AS vend_title
FROM vendors
ORDER BY vend_name
#檢索視圖
SELECT * FROM vendorlocations
用視圖過濾不想要的數據
- 視圖對於應用普通的WHERE子句也很有用。定一個customeremaillist視圖,過濾沒有電子郵件地址的客戶
#創建視圖
CREATE VIEW customeremaillist AS
SELECT cust_id,cust_name,cust_email
FROM customers
WHERE cust_email IS NOT NULL
#檢索視圖
SELECT * FROM customeremaillist