二10、使用視圖函數
一、 視圖索引
視圖是虛擬的表。與包含數據的表不同,視圖只包含使用時動態檢索數據的查詢。rem
例如:SELECT cust_name, cust_contact產品
FROM customers, orders, orderitemsit
WHERE customers.cust_id = orders.cust_idio
AND orderitems.order_num = order.order_numemail
AND prod_id = ‘TNT2’;基礎
此查詢用來檢索訂購了某個特定產品的用戶。能夠看到檢索語句比較複雜,另外若是要檢索其餘產品的相同數據,必須修改最後的WHERE子句。權限
若是把整個查詢包裝成一個名爲productcustomers的虛擬表,則能夠以下輕鬆地檢索出相同的數據:語法
SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = ‘TNT2’;
爲何使用視圖:
視圖僅僅是用來查看存儲在別處的數據的一種設施,視圖自己不包含數據。
視圖的規則和限制:
二、 使用視圖
視圖的建立:
(1)、利用視圖簡化複雜的聯結
例如: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,將列出訂購了任意產品的客戶。
爲了檢索訂購了產品TNT2的客戶,可以下進行:
SELECT cust_name, cust_contact
FROM productcustomets
WHERE prod_id = ‘TNT2’;
能夠看到,視圖極大地簡化了複雜SQL語句的使用。利用視圖,可一次性編寫基礎的SQL,而後根據須要屢次使用。
(2)、用視圖從新格式化檢索出的數據
下面的SELECT語句在單個組合計算列中返回供應商名和位置:
SELECT Contact(RTrim(vend_name), ’ (‘, RTrim(vend_country), ‘)’)
AS vend_title
FROM vendors
ORDER BY vend_name;
把此語句轉換爲視圖,可按以下進 行:
CREAT VIEW vendorlocations AS
SELECT Contact(RTrim(vend_name), ’ (‘, RTrim(vend_country), ‘)’)
AS vend_title
FROM vendors
ORDER BY vend_name;
(3)、用視圖過濾不想要的數據
視圖對於應用普通的WHERE子句也頗有用。例如,能夠定義customeremaillist視圖,過濾沒有電子郵件的客戶:
CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_eamil IS NOT NULL;
(4)、使用視圖與計算字段
視圖對於簡化計算字段的使用特別有用。
例如:檢索某個特定訂單中的物品,計算每種物品的總價格:
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
將其轉換爲一個視圖:
CREATE VIEW orderitemsexpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems;
(5)、更新視圖
視圖的數據可否更新要視狀況而定。
一般視圖是能夠更新的(即,能夠對他們使用INSERT、UPDATE和DELETE)。更新一個視圖將更新其基表。若是對視圖增長或刪除行,其實是對基表增長或刪除行。
可是,並不是全部視圖都是可更新的。若是MySQL不能正確地肯定被更新的基數據,則不容許更新。若是視圖定義如下操做,則不能進行視圖的更新: