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等都不能對檢視進行更新操作,因此我們前面的例子也是不能進行更新操作的,事實上,檢視更多的是用於資料檢索而更新,因此對於更新也沒有必要進行過多闡述。
檢視的本質 到此對於檢視的建立和使用都比較清晰了,現在準備進一步認識檢視的本質,前面我們反覆說過,檢視是一張虛擬表,是不帶任何資料的,每次查詢時只是從普通表中動態地獲取資料並組合,只不過外表看起來像一張表罷了。其原理通過下圖便一目瞭然: