SQL(十七)視圖(即虛擬的表,可簡化之前的SQL操作)

入一點門

視圖是什麼

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
視圖是一個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:在視圖的創建中必用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章