SQL必知必會 筆記 第十八章 使用視圖,sql必知
18.1視圖
視圖是虛擬表。與包含資料的表不一樣,試圖只包含使用時動態檢索資料的查詢。
可將整個查詢封裝成一個名為ProductCustomers的虛擬表,則可以如下輕鬆地檢索出相同的資料。
SELECT cust_name,cust_contactFROM ProductCustomersWHERE prod_id = 'RGAN01';
ProductCustomers是一個視圖,作為視圖,他不包含任何列或資料,它包含的是一個查詢。
18.1.1為什麼使用視圖
(1)重用SQL語句
(2)簡化複雜的SQL操作。在編寫查詢後,可以方便地重用它而不必知道他的基本查詢細節。
(3)使用表的組成部分而不是整個表。
(4)保護資料。可以給使用者授予表的特定部分的存取權限而不是整個表的存取權限。
(5)更改資料可是和表示。視圖可返回與底層表的表示和格式不同的資料。
18.1.2視圖的規則和限制
關於視圖建立和使用的一些最常見的規則和限制
(1)與表一樣,視圖必須唯一命名
(2)對於可以穿件的視圖數目沒有限制
(3)為了建立視圖,必須具有足夠的存取權限。這些許可權通常由資料庫管理員授予。
(4)視圖可以嵌套,即可以利用從其他視圖中檢索資料的查詢來構造一個視圖。
(5)許多DBMS禁止在視圖查詢中使用ORDER BY子句。
(6)有的DBMS要求命名返回的所有列,如果列是計算欄位,則需要使用別名。
(7)視圖不能索引,也不能有關聯的觸發器或預設值。
(8)有的DBMS把視圖作為唯讀查詢,這表示可以從視圖檢索資料,但不能將資料寫會底層表。
(9)有的DBMS允許建立這樣的視圖,它不允許進行導致行不再屬於視圖的插入或更新。
18.2建立視圖
視圖用CREATE VIEW語句來建立。CREATE VIEW只能用於建立不存在的視圖。
用DROP刪除視圖:
DROP VIEW viewname;
覆蓋(或更新)視圖:必須先DROP它,然後再重新建立它。
18.2.1利用視圖簡化複雜的連接
CREATE VIEW ProductCustomers ASSELECT cust_name,cust_contact,prod_idFROM Customers,Orders,OrderItemsWHERE Customers.cust_id = Order.cust_id AND OrderItems.order_num = Order.order_num;
這條語句建立一個名為ProductCustomers的視圖,他連接撒個表,以返回已訂購了任意產品的所有客戶的列表。
檢索訂購了產品RGAN01的客戶
SELECT cust_name,cust_contactFROM ProductCustomersWHERE prod_id = 'RGAN01';
18.2.2用視圖重新格式化檢索出的資料
建立格式化視圖
CREATE VIEW VendorsLocations ASSELECT RTRM(vend_name) || ' ( ' || RTRIM(vend_country) || ' ) ' AS vend_titleFROM Vendors;
18.2.3用試圖過濾不想要的資料
定義CustomerEMailList 視圖,過濾沒有電子郵件地址的客戶。
CREATE VIEW CustomerEMailList ASSELECT cust_id, cust_name, cust_emailFROM CustomersWHERE cust_email IS NOT NULL;
18.2.4使用視圖與計算欄位
檢索某個特定訂單中的物品,計算每種物品的總價格
CREATE VIEW OrderItemExpanded ASSELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_price
FROM OrderItems;
根據視圖檢索訂單20008的詳細內容
SELECT *FROM OrderItemsExpandedWHERE order_num = 20008;