MySQL基礎之MySQL必知必會(二十二)使用檢視
阿新 • • 發佈:2020-08-03
檢視
檢視是虛擬的表。與包含資料的表不一樣, 檢視只包含使用時動態檢索資料的查詢。
為什麼使用檢視
- 重用SQL語句
- 簡化複雜的SQL操作。在編寫查詢後, 可以方便的重用它而不必知道它的基本查詢細節
- 使用表的組成部分而不是整個表
- 保護資料。可以給使用者授予表的特定部分的訪問許可權而不是整個表的訪問許可權
- 更改資料格式和表示。檢視可返回與底層表的表示和格式不同的資料
在檢視建立之後, 可以用與表相同的方式利用它們。可以對檢視執行SELECT操作, 過濾和排序資料, 將檢視聯結到其他檢視或表, 甚至能新增和更新資料
主要的是知道檢視僅僅是用來檢視儲存在別處的資料的一種措施。檢視本身不包含資料, 因此他們返回的資料是從其他表中檢索出來的。在新增或更改這些表中的資料時, 檢視將返回改變過的資料
檢視的規則和限制
- 與表一樣, 檢視必須唯一命名
- 對於可以建立的檢視數目沒有限制
- 為了建立檢視, 必須具有足夠的訪問許可權
- 檢視可以巢狀, 即可以利用從其他檢視中檢索資料的查詢來構造一個檢視
- ORDER BY可以用在檢視中
- 檢視不能索引, 也不能有關聯的觸發器或預設值
- 檢視可以和表一起使用
使用檢視
檢視的建立
- 檢視用CREATE VIEW語句來建立
- 使用SHOW CREATE VIEW viewname; 來檢視建立檢視的語句
- 用DROP刪除檢視, 其語法為DROP VIEW viewname;
- 更新檢視時, 可以先用DROP再用CREATE, 也可以直接用CREATE OR REPLACE VIEW。如果要更新的資料不存在, 則第2條更新語句會建立一個檢視
利用檢視簡化複雜的聯結
檢視最常見的應用之一是隱藏複雜的SQL, 這通常都會涉及聯結。
MariaDB [crashcourse]> 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; Query OK, 0 rows affected (0.008 sec) MariaDB[crashcourse]>
檢視極大的簡化了複雜的SQL語句的使用。利用檢視, 可以次性編寫基礎的SQL, 然後根據需要多次使用
用檢視重新格式化檢索出的資料
如果進行需要一個格式的結果, 不必在每次需要時執行聯結, 建立一個檢視, 每次需要的時候使用它即可。
MariaDB [crashcourse]> CREATE VIEW vendorlocations AS SELECT Concat(RTrim(vend_name), '(', RTirm(vend_country), ')') AS vendors ORDER BY vend_name;
用檢視過濾不需要的資料
檢視對於應用普遍的WHERE子句也很有用。
MariaDB [crashcourse]> CREATE VIEW customeremaillist AS SELECT cust_id, cust_name, cust_email FROM customers WHERE cust_email IS NOT NULL; Query OK, 0 rows affected (0.002 sec) MariaDB [crashcourse]>
使用檢視與計算欄位
正確使用檢視, 可以極大地簡化複雜的資料處理
MariaDB [crashcourse]> CREATE VIEW orderitemsexpanded AS SELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM orderitems; Query OK, 0 rows affected (0.002 sec) MariaDB [crashcourse]>
更新檢視
通常, 檢視是可以更新的。更新一個檢視將更新其基表。如果對檢視增加或刪除行, 實際上是對其基表增加或刪除行。
但是, 並非所有的檢視都是可更新的。基本上可以說, 如果MySQL不能正確地確定被更新的基資料, 則不允許更新。
這實際意味著, 如果檢視定義中有以下操作, 則不能進行檢視的更新
- 分組(使用GROUP BY和HAVING)
- 聯結
- 子查詢
- 並
- 聚集函式(Min()、Count()、Sum()等)
- DISTINCT
- 匯出(計算)列
一般, 應該將檢視用於檢索(SELECT語句)而不是用於更新(INSERT, UPDATE和DELETE)