1. 程式人生 > >mysql:第九章 檢視的使用

mysql:第九章 檢視的使用

什麼是檢視

檢視是一張虛擬的表,為什麼是虛擬呢?因為檢視與資料庫中存在的表不太一樣,前面我們建立的4張表都是包含資料的,如使用者資訊,訂單資訊等,而檢視則是不包含資料的,下面通過一個例子來演示檢視,下面的sql是查詢王五的所有訂單情況,需要關聯到orders表、orderdetail表、items表、user表

mysql> select u.username , o.number , tm.name as itemsName , tm.price , od.items_num from 
    ->  (
    ->  (orders as o inner join orderdetail as od on o.id = od.orders_id ) 
    ->  inner join items as tm on od.items_id = tm.id 
    ->  )
    ->  inner join user as u on o.user_id = u.id
    ->  where username='王五';
+----------+---------+-------------+---------+-----------+
| username | number  | name        | price   | items_num |
+----------+---------+-------------+---------+-----------+
| 王五     | 1000010 | MacBook Air |  8298.9 |         1 |
| 王五     | 1000010 | MacBook Pro | 10982.0 |         3 |
| 王五     | 1000011 | 揹包         |   200.0 |         4 |
| 王五     | 1000011 | MacBook Pro | 10982.0 |         3 |
+----------+---------+-------------+---------+-----------+
4 rows in set (0.01 sec)

顯然資料已如期查詢出來了,但是我們發現任何需要這個資料的人都必須瞭解相關聯的表結構,並且需要知道如何建立查詢和對錶進行聯結,為了檢索其他使用者的相同資料必須修改Where條件並帶上一大段關聯查詢的sql語句。是的,每次這樣的操作確實挺麻煩的,假如現在可以把這個除了where條件外的sql查詢出來的資料包裝成一個名為user_order_data的虛擬表,就可以使用以下方式檢索出資料了。

select * from user_order_data where username='王五';

按這樣的方式每次查詢不同的使用者只需修改where條件即可也不同再寫那段看起有點噁心的長sql了,而事實上user_order_data就是一張視圖表,也可稱為虛擬表,而這就是檢視最顯著的作用了。

檢視建立與使用

瞭解完什麼是檢視後,我們先來看看如何建立檢視和使用檢視,使用以下語法:

CREATE VIEW 檢視名(列名,...) AS SELECT 語句

現在我們使用前面關聯查詢的orders表、orderdetail表、items表、user表來建立檢視user_order_data

-- 建立檢視虛擬表user_order_data

mysql>  create view user_order_data(username,number,itemname,price,items_num) as select u.username , o.number , tm.name , tm.price , od.items_num from 
    ->  (
    ->  (orders as o inner join orderdetail as od on o.id = od.orders_id ) 
    ->  inner join items as tm on od.items_id = tm.id 
    ->  )
    ->  inner join user as u on o.user_id = u.id;
Query OK, 0 rows affected (0.01 sec)

-- 使用檢視
mysql> select * from user_order_data;
+----------+---------+-------------+---------+-----------+
| username | number  | itemname    | price   | items_num |
+----------+---------+-------------+---------+-----------+
| 王五     | 1000010 | MacBook Air |  8298.9 |         1 |
| 王五     | 1000010 | MacBook Pro | 10982.0 |         3 |
| 王五     | 1000011 | 揹包         |   200.0 |         4 |
| 王五     | 1000011 | MacBook Pro | 10982.0 |         3 |
+----------+---------+-------------+---------+-----------+
4 rows in set (0.01 sec)

注意這裡使用了CREATE OR REPLACE VIEW語句,意思就是不存在就建立,存在就替換。

如果想刪除檢視可以使用以下語法:

DROP VIEW 檢視名稱

在使用檢視的過程還有些需要注意的點,如下

與建立表一樣,建立檢視的名稱必須唯一

建立檢視的個數並沒限制,但是如果一張檢視巢狀或者關聯的表過多,同樣會引發效能問題,在實際生產環節中部署時務必進行必要的效能檢測。

在過濾條件資料時如果在建立檢視的sql語句中存在where的條件語句,而在使用該檢視的語句中也存在where條件語句時,這兩個where條件語句會自動組合

order by 可以在檢視中使用,但如果從該檢視檢索資料的select語句中也含有order by ,那麼該檢視中的order by 將被覆蓋。

檢視中不能使用索引,也不能使用觸發器(索引和觸發器後面會分析)

使用可以和普通的表一起使用,編輯一條聯結檢視和普通表的sql語句是允許的。

關於使用檢視對資料的進行更新(增刪改),因為檢視本身並沒有資料,所以這些操作都是直接作用到普通表中的,但也並非所有的檢視都可以進行更新操作,如檢視中存在分組(group by)、聯結、子查詢、並(unoin)、聚合函式(sum/count等)、計算欄位、DISTINCT等都不能對檢視進行更新操作,因此我們前面的例子也是不能進行更新操作的,事實上,檢視更多的是用於資料檢索而更新,因此對於更新也沒有必要進行過多闡述。

檢視的本質 到此對於檢視的建立和使用都比較清晰了,現在準備進一步認識檢視的本質,前面我們反覆說過,檢視是一張虛擬表,是不帶任何資料的,每次查詢時只是從普通表中動態地獲取資料並組合,只不過外表看起來像一張表罷了。其原理通過下圖便一目瞭然: