文章目錄
入一點門
視圖是什麼
視圖是一個lucky dog,所有實現提供一致的支持,不容易。
複雜視圖的性能可能很差,小心。
用示例說明
假設要檢索買了產品號爲rgan01的產品的所有顧客,則按之前的方法,使用聯結:
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 = 'RGAN01';
如果我們可以把這個查詢封裝爲一個叫做productsCustomers的虛擬表,則可以這麼檢索出相同的數據:
封裝:
create view productscustomers 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;
封裝後在mysql workbench左邊可以看到這個視圖
封裝後,利用視圖實現查詢
select cust_name, cust_contact
from productsCustomers
where prod_id = 'RGAN01';
查詢結果一樣,但是視圖的代碼更加簡單,想查別的產品隨便改產品號即可
而且可重用
如果對視圖執行下面的查詢,則返回訂購了任意產品的顧客,即只要買了產品都列出來
select * from productscustomers;
視圖的常見應用
視圖的規則
小結
到現在其實還是不太明白,因爲例子只有一個,並且還沒說怎麼把一個查詢封裝爲視圖,只講了規則和注意事項,沒有經手完整示例還是不太明白
創建視圖:create view(刪除是drop view)
下面的幾個示例都是視圖常用的用途
示例1:用視圖來簡化複雜的聯結
見第一節的用示例說明裏的示例
示例2: 用視圖格式化檢索出的數據
select concat(vend_name, '(', vend_country, ')')
as vend_title
from vendors
order by vend_name;
create view vendorlocations as
select concat(vend_name, '(', vend_country, ')')
as vend_title
from vendors;
可以看到,用了兩次as,一次是後面跟整個select查詢,一次是後面跟計算字段的別名。
現在可以這樣:
select * from vendorlocations;
但是下面的代碼是錯的,我企圖對視圖檢索出的數據按供應商名稱來排序結果:
select * from vendorlocations
order by vend_name;
可見視圖 vendorlocations中果然沒有列,沒有數據,他根本不認識vend_name,vend_name是vendors表的列
示例3:用視圖過濾掉不想要的數據
過濾出所有郵箱地址不爲空的客戶
create view CustomerEmailList as
select cust_id, cust_name, cust_email
from customers
where cust_email is not null;
用視圖過濾掉了郵箱地址爲空的行,讓他們不顯示出來
select * from CustomerEmailList;
示例4:用視圖簡化計算字段的使用
查詢一個訂單中所有產品的相關信息:
select prod_id,
quantity,
item_price,
quantity*item_price as expanded_price
from orderitems
where order_num = 20008;
可以把這個查詢轉換爲一個視圖:
create view OrderItemsExpanded as
select prod_id,
quantity,
item_price,
quantity*item_price as expanded_price
from orderitems;
於是查詢就可以變爲:
select *
from OrderItemsExpanded
where order_num = 20008;
注意,這裏封裝查詢爲視圖時比上面直接用select多加了一個order_num,這一項是必須加的,因爲只有加了,纔可以用where order_num = 20008;,否則會報錯說不認識order_num
小結
- 一個視圖只能有一個select語句
- 視圖主要是用來簡化複雜操作的,包括計算字段,格式化,過濾等等。
大概有一些感覺了,但是還需要大量練習。明白了視圖是查詢,沒有數據了,它只有select後面跟着的那些列,所有對視圖用where子句的話只可以識別創建視圖時select後面的那些列。
總結
提供了對select語句的封裝層次,這個說的好,也感受到了,把一個select語句封裝起來了,就可以複用這一個查詢。
沒想到SQL也有封裝和複用的概念呢,果然好的思想在哪裏都會有體現。
關鍵字
- create view
- drop view
- as:在視圖的創建中必用