《MySQL資料庫必知必會》學習筆記十二(視圖)——掌握部分

《MySQL必知必會》學習筆記十二(視圖)——掌握部分。

視圖

一、視圖是什麼,他們怎樣工作,何時使用他們,如何利用視圖進行簡化sql操作。

————————————– ————————————– ————————————–

視圖是虛擬的表,與包含數據的表不同,視圖隻包含使用時動態檢索數據的查詢,主要是用於查詢。

理解: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’;

這裡寫圖片描述

此查詢用來檢索訂購瞭某個特定產品的用戶信息,任何需要這個數據的人,都要瞭解相關表的結構,並且知道如何創建查詢和對表進行聯結,而為瞭檢索其他產品的訂購客戶,必須修改最後的where子句。

現在,我們可以假設可以把整個查詢包裝成一個名為productcustomers的虛擬表,則可以輕松的查詢出數據。

select cust_name,cust_contact from productcustomers where prod_id=’tnt2’;

這就是視圖的作用,productcustomers 是一個視圖,作為視圖,他不包含表中應該有的任何列和數據,她隻是包含一個SQL查詢

為什麼使用視圖:

1. 重用sql語句

2. 簡化復雜的sql操作,在編寫查詢後,可以方便地重用它而不必知道他的基本查詢細節。

3. 使用表的組成部分而不是整個表。

4. 保護數據。可以給用戶授予表的特定部分的訪問權限而不是整個表的訪問權限。

5. 更改數據格式和表示。視圖可返回與底層表的表示和格式不同的數據。

註意:

1. 在視圖創建之後,可以用與表基本相同的方式利用它們。可以對視圖執行select操作,過濾和排序數據,將視圖聯結到其他視圖或表,甚至能添加和更新數據。

2. 重要的是知道視圖僅僅是用來查看存儲在別處的數據的一種設施。視圖本身不包含數據,因此它們返回的數據時從其他表中檢索出來的。在添加和更改這些表中的數據時,視圖將返回改變過的數據。

3. 因為視圖不包含數據,所以每次使用視圖時,都必須處理查詢執行時所需的任一檢索。如果你使用多個聯結和過濾創建瞭復雜的視圖或者嵌套瞭視圖,可能會發現性能下降得很厲害。因此,在部署使用瞭大量視圖的應用前,應該進行測試。

視圖的規則和限制

1. 與表一樣,視圖必須唯一命名;

2. 可以創建任意多的視圖;

3. 為瞭創建視圖,必須具有足夠的訪問權限。這些限制通常由資料庫管理人員授予。

4. 視圖可以嵌套,可以利用從其他視圖中檢索數據的查詢來構造一個視圖。

5. Order by 可以在視圖中使用,但如果從該視圖檢索數據select中也是含有order by,那麼該視圖的order by 將被覆蓋。

6. 視圖不能索引,也不能有關聯的觸發器或默認值

7. 視圖可以和表一起使用

視圖的創建

1. 利用create view 語句來進行創建視圖

2. 使用show create view viewname;來查看創建視圖的語句

3. 用drop view viewname 來刪除視圖

4. 更新視圖可以先drop在create,也可以使用create or replace view。

視圖的使用

1、利用視圖簡化復雜的聯結

視圖最常用的就是隱藏復雜的sql,這通常會涉及到聯結,視圖極大的佳簡化瞭復雜的sql語句的使用,利用視圖可以一次性編寫基礎的sql語句,然後根據需要被多次使用。創建可重用的視圖,可以擴展視圖的范圍不僅僅使得它能被重用,而且甚至更有用,這樣做不需要創建和維護多個類似視圖。

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'; //原語句

create view productcustomers as select cust_name,cust_contact,prod_id fro

m customers,orders,orderitems where customers.cust_id = orders.cust_id and order

items.order_num = orders.order_num;

// 查詢客戶訂購的產品列表視圖

select cust_name,cust_contact from productcustomers where prod_id='tnt2';

//利用視圖查詢客戶id為tnt2的訂購列表

這裡寫圖片描述

2、用視圖重新格式化檢索出的數據。

SELECT Concat(Trim(vend_name),'[',trim(vend

_country),']') as vend_title from vendors order by vend_name;// 原語句

現在,假如經常要使用這個格式的結果,不必在每次需要時執行聯結,創建一個視圖,每次需要時使用它即可。為此可以將sql語句轉換為視圖。

CREATE VIEW vendorlocation AS SELECT Concat(Trim(vend_name),'[',trim(vend

_country),']') as vend_title from vendors order by vend_name; // 視圖語句

SELECT * FROM vendorlocation; //使用視圖

這裡寫圖片描述

3、用視圖過濾不想要的數據

視圖對於應用於普通的where子句也是很有用,例如,過濾沒有電子郵件的客戶。

select cust_name,cust_email from customers where cust_email is not null;// 原語句

CREATE VIEW customeremail AS select cust_name,cust_email from customers where cust_email is not null; // 視圖

SELECT * FROM customeremail;//使用視圖

// where子句與where子句 如果從視圖中檢索數據時使用瞭一個where子句,則兩組子句(一組在視圖中,另一組是傳遞給視圖的)將自動組合。

這裡寫圖片描述

4、使用視圖與計算字段

視圖對於簡化計算字段的使用特別有用。

select prod_id,order_num,quantity,item_price,quantity*item_price as total_price fro

m orderitems where order_num = 20005; //查詢訂單號為20005的消費

CREATE VIEW orderitemsexpanded AS select prod_id,order_num,quantity,item_price,quantity*item_price as total_price from orderitems;

// 創建視圖

SELECT * FROM orderitemsexpanded where order_num='20005'; // 使用視圖

//註意 如果視圖中不包含order_num列,則在外部的where子句中會無法識別order_num列,一般都是使用視圖中包含的列。

這裡寫圖片描述

5、更新視圖

視圖是否可以更新,要視情況而定。

通常情況下視圖是可以更新的,可以對他們進行insert,update和delete。更新視圖就是更新其基表(視圖本身沒有數據)。如果你對視圖進行增加或者刪除行,實際上就是對基表進行增加或者刪除行。

但是,如果MySQL不能正確的確定更新的基表數據,則不允許更新(包括插入和刪除),這就意味著視圖中如果存在以下操作則不能對視圖進行更新:(1)分組(使用group by 和 having );(2)聯結;(3)子查詢;(4)並;(5)聚集函數;(6)dictinct;(7)導出(計算)列。【註意:基於5.0版本的規則,不排除後續變化】

總結:

一般將視圖用於檢索,而不是更新。

視圖為虛擬的表,他們包含的不是數據而是根據需要檢索數據的查詢語句,視圖提供瞭一種MySQL的select語句層次的封裝,可以用來簡化數據處理以及重新格式化基礎數據或保護基礎數據。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *