MySQL學習筆記20

二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’;

 

 

爲何使用視圖

  •       重用SQL語句
  •       簡化複雜的SQL操做
  •    使用表的組成部分而不是整個表
  •       保護數據
  •       更改數據格式和表示

視圖僅僅是用來查看存儲在別處的數據的一種設施,視圖自己不包含數據。

 

視圖的規則和限制:

  •       與表同樣,視圖必須惟一命名。
  •       對於能夠建立的視圖數目沒有限制
  •       爲了建立視圖,必須具備足夠的訪問權限
  •       視圖能夠嵌套。便可以利用從其餘視圖中檢索數據的查詢來構造一個視圖
  •       ORDER BY能夠用在視圖中,但若是從該視圖檢索數據的SELECT語句中也含有ORDER BY,那麼該視圖中的ORDER BY將被覆蓋
  •       視圖不能被索引,也不能有關聯的觸發器或默認值
  •       視圖能夠和表一塊兒使用

二、 使用視圖

視圖的建立:

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

 

(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不能正確地肯定被更新的基數據,則不容許更新。若是視圖定義如下操做,則不能進行視圖的更新:

  •  分組(使用GROUP BY和HAVING);
  •  聯結;
  •  子查詢;
  •  並;
  •  彙集函數(Min()、Count()、Sum()等);
  •  DISTINCT;
  •  導出(計算)列。
相關文章
相關標籤/搜索