10、視圖

1. 爲何使用視圖?

  • 重用SQL語句。
  • 簡化複雜的SQL操做。在編寫查詢後,能夠方便地重用它而沒必要知道它的基本查詢細節。
  • 使用表的組成部分而不是整個表。
  • 保護數據。能夠給用戶授予表的特定部分的訪問權限而不是整個表的訪問權限。

在視圖建立以後,能夠用與表基本相同的方式利用它們。能夠對視圖執行 SELECT操做,過濾和排序數據,將視圖聯結到其餘視圖或表,甚至能添加和更新數據。mysql

由於視圖不包含數據,因此每次使用視圖時,都必須處理查詢執行時所需的任一個檢索。有可能性能降低的厲害。sql

2.視圖規則。

  • 惟一命名。
  • 能夠建立的視圖數目沒有限制。
  • 爲了建立視圖,必須具備足夠的訪問權限。這些限制一般由數據庫管理人員授予。
  • 視圖能夠嵌套, 便可以利用從其餘視圖中檢索數據的查詢來構造一個視圖。
  • ORDER BY 能夠用在視圖中,但若是從該視圖檢索數據 SELECT 中也含有 ORDER BY ,那麼該視圖中的 ORDER BY 將被覆蓋。
  • 視圖不能索引,也不能有關聯的觸發器或默認值。
  • 視圖能夠和表一塊兒使用。例如,編寫一條聯結表和視圖的 SELECT語句。

3.視圖的使用。

(1)語法。
  • 視圖用 CREATE VIEW 語句來建立。
  • 使用 SHOW CREATE VIEW viewname;來查看建立視圖的語句。
  • 用 DROP 刪除視圖,其語法爲 DROP VIEW viewname;
  • 更新視圖時,能夠先用DROP再用CREATE,也能夠直接用CEATE OR REPLACE VIEW。若是要更新的視圖不存在,則第2條更新語句會建立一個視圖;若是要更新的視圖存在,則第2條更新語句會替換原
    有視圖。
(2) 實際使用。

假如咱們要找到prod_id爲‘TNT2’的訂單號、顧客的信息,咱們將使用三張表以下:數據庫

mysql> 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 = 'TNT2';

這樣很複雜,咱們能夠把須要的字段都提煉出來成爲一個視圖:函數

mysql> 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;

如今咱們只要在視圖中檢索prod_id值爲'TNT2'便可。性能

mysql> select cust_name,cust_contact 
-> from productcustomers
-> where prod_id = 'TNT2';

結果一致:code

+----------------+--------------+
| cust_name      | cust_contact |
+----------------+--------------+
| Coyote Inc.    | Y Lee        |
| Yosemite Place | Y Sam        |
+----------------+--------------+
2 rows in set (0.00 sec)

建立可重用的視圖:排序

擴展視圖的範圍,有助於咱們以後反覆使用此視圖而不用新建其它的視圖。例如咱們上面生產全部產品的客戶而不單單是生產TNT2的客戶。這樣就可能有助於咱們以後的檢索了。索引

視圖使用狀況:
能夠將咱們須要的一些值放到視圖中,好比鏈接的新數據:產品

Create View vendorlocation AS
select concat(RTrim(vend_name),'(',RTrim(vend_Country),')') 
as vend_title
from vendors;

這樣下次從這個視圖裏檢索數據進行了。it

又好比咱們能夠把非空值的數據都檢索到一個視圖中,下次查詢非空值就能夠直接檢索這個視圖。

咱們也可使用計算字段和視圖一塊兒。好比兩個列相乘,也能夠保存在視圖中,以後直接檢索這個視圖便可。

(3) 視圖使用注意。

==咱們使用視圖是爲了檢索,而不是更新數據。==

即便咱們也可能能夠經過視圖來修改數據(這樣基表中的數據也會被改變),可是咱們不提倡這麼作。並且視圖中更新數據也頗有限制。使用分組,子查詢,並,聯結,彙集函數,distinct等定義的視圖都不能被更新。

相關文章
相關標籤/搜索