1. 程式人生 > >17.視圖--SQL

17.視圖--SQL

關聯 計算 語句 _id 擴展 命名 發生 數據格式 items

一、什麽是視圖


視圖是虛擬的表

為什麽使用視圖

  • 重用SQL語句。
  • 簡化復雜的SQL操作。在編寫查詢後,可以方便地重用它而不必知道其基本查詢細節。
  • 使用表的一部分而不是整個表。
  • 保護數據。可以授予用戶訪問表的特定部分的權限,而不是整個表的訪問權限。
  • 更改數據格式和表示。視圖可返回與底層表的表示和格式不同的數據。

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

視圖的規則和限制

  • 與表一樣,視圖必須唯一命名(不能給視圖取與別的視圖或表相同的名字)。
  • 對於可以創建的視圖數目沒有限制。
  • 創建視圖,必須具有足夠的訪問權限。這些權限通常由數據庫管理人員授予。
  • 視圖可以嵌套,即可以利用從其他視圖中檢索數據的查詢來構造視圖。所允許的嵌套層數在不同的DBMS中有所不同(嵌套視圖可能會嚴重降低查詢的性能,因此在產品環境中使用之前,應該對其進行全面測試)。
  • 許多DBMS禁止在視圖查詢中使用ORDER BY子句。
  • 有些DBMS要求對返回的所有列進行命名,如果列是計算字段,則需要使用別名(關於列別名的更多信息,請參閱第7課)。
  • 視圖不能索引,也不能有關聯的觸發器或默認值。
  • 有些DBMS把視圖作為只讀的查詢,這表示可以從視圖檢索數據,但不能將數據寫回底層表。詳情請參閱具體的DBMS文檔。
  • 有些DBMS允許創建這樣的視圖,它不能進行導致行不再屬於視圖的插入或更新。例如有一個視圖,只檢索帶有電子郵件地址的顧客。如果更新某個顧客,刪除他的電子郵件地址,將使該顧客不再屬於視圖。這是默認行為,而且是允許的,但有的DBMS可能會防止這種情況發生。

二、創建與使用視圖


說明:視圖重命名

  刪除視圖,可以使用DROP語句,其語法為DROP VIEW viewname;。
覆蓋(或更新)視圖,必須先刪除它,然後再重新創建。

CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num;

分析▼
這條語句創建一個名為ProductCustomers的視圖,它聯結三個表,返回已訂購了任意產品的所有顧客的列表。如果執行SELECT * FROM
ProductCustomers,將列出訂購了任意產品的顧客。

SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = RGAN01;

分析▼
這條語句通過WHERE子句從視圖中檢索特定數據。當DBMS處理此查詢時,它將指定的WHERE子句添加到視圖查詢中已有的WHERE子句中,
以便正確過濾數據。

提示:創建可重用的視圖
創建不綁定特定數據的視圖是一種好辦法。例如,上面創建的視圖返回訂購所有產品而不僅僅是RGA N01的顧客(這個視圖先創建)。擴展
視圖的範圍不僅使得它能被重用,而且可能更有用。這樣做不需要創建和維護多個類似視圖。

17.視圖--SQL