概述
資料庫中關於資料的查詢有時非常複雜,例如表連線、子查詢等,這種查詢編寫難度大,很容易出錯。另外,在具體操作表時,有時候要求只能操作部分欄位。
為了提高複雜 SQL 語句的複用性和表的操作的安全性,MySQL 提供了檢視特性。所謂檢視,本質上是一種虛擬表,同樣包含一系列帶有名稱的列和行資料。行和列的資料來自自定義檢視的查詢所引用的基本表,並在具體引用檢視時動態生成
檢視的特點如下:
- 檢視的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關係
- 檢視是由基本表(實表)產生的表(虛表)
- 檢視的建立和刪除不影響基本表
- 對檢視內容的更新(增刪改)直接影響基本表
- 當檢視來自多個基本表,不允許新增和刪除資料
建立檢視
1. 建立檢視的語法形式
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [column_list]
AS SELECT statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
- CREATE 表示建立新的檢視,REPLACE 表示替換已經建立的檢視
- ALGORITHM 表示檢視選擇的演算法,取值有三種:
- UNDEFINED:MySQL 自動選擇演算法
- MERGE:將使用的檢視語句與檢視定義合併起來,使得檢視定義的某一部分取代語句對應的部分
- TEMPLATE:表示將檢視的結果放入臨時表,然後用臨時表來執行語句
- view_name 表示檢視的名稱
- column_list 為屬性列
- SELECT statement 表示 SELECT 語句
- 引數 [WITH [CASCADED | LOCAL] CHECK OPTION] 表示檢視在更新時保證在檢視的許可權範圍內,CASCADED 與 LOCAL 為可選引數:
- CASCADED 為預設值,表示更新檢視時要滿足所有相關檢視和表的條件
- LOCAL 表示更新檢視時滿足該檢視本身定義的條件即可
該語句要求具有針對檢視的 CREATE VIEW 許可權,以及針對由 SELECT 語句選擇的每一列上的某些許可權。對於在 SELECT 語句中其他地方使用的列,必須具有 SELECT 許可權,如果還有 OR REPLACE 子句,就必須在檢視上具有 DROP 許可權
2. 在單表建立檢視
示例:在資料庫 company 中,由員工表 t_employee 建立出隱藏工資欄位 salary 的檢視 view_selectemployee
CREATE VIEW view_selectemployee AS
SELECT id,name,gender,age,deptno FROM t_employee;
查詢檢視
SELECT * FROM view_selectemployee;
3. 在多表建立檢視
示例:在資料庫 company 中,由部門表 t_dept 和員工表 t_employee 建立一個名為 view_dept_employee 的檢視
CREATE ALGORITHM=MERGE VIEW
view_dept_employee(name,dept,gender,age,loc)
AScSELECT iname,t_dept.deptname,gender,age,t_dept.location
FROM t_employee, t_dept WHERE t_employee.deptno = t_dept.deptno
WITH LOCAL CHECK OPTION;
檢視檢視
使用 DESCRIBE | DESC 語句檢視檢視基本資訊,因為檢視也是一張表,只不過比較特殊
DESCRIBE | DESC viewname
在 MySQL 中,所有檢視的定義都存在資料庫 information_schema 中的表 views 中,查詢 views 表可以得到資料庫中所有檢視的詳細資訊
SELECT * FROM information_schema.views
WHERE table_name = 'viewname' \G
修改檢視
修改檢視是指修改資料庫中存在的檢視,當基本表的某些欄位發生變化時,可以通過修改檢視來保持與基本表的一致
在 MySQL 中,CREATE OR REPLACE VIEW
語句可以用來修改檢視。當檢視已經存在,對檢視進行修改,否則建立檢視
CREATE OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [column_list]
AS SELECT statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
也可以使用 ALTER 語句修改檢視,其語法中的關鍵字和引數都與建立檢視是一樣的
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [column_list]
AS SELECT statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
更新檢視
更新檢視是指通過檢視來插入、更新和刪除表中的資料。可以使用 SQL 語句更新檢視,達到更新基本表資料。反過來,更新基本表的資料,也會更新檢視的資料
但實際上,並不是所有檢視都可以更新,以下幾種情況是不能更新檢視的:
- 檢視中包含 SUM()、COUNT()、MAX() 和 MIN() 函式
- 檢視中包含 UNION、UNION ALL、DISTINCT、GROUP BY 和 HAVING 等關鍵字
- 常量檢視,例如:
CREATE VIEW view_1 AS SELECT 'Rebecca' AS name;
- 包含子查詢的檢視
- 由不可更新的檢視匯出的檢視
- 建立檢視時,ALGORITHM 為 TEMPTABLE 型別
- 檢視對應的列存在沒有預設值的列,而且該列沒有包含在檢視裡
- 設定了 [WITH [CASCADED | LOCAL] CHECK OPTION] 引數,需要符合對應條件才能更新
刪除檢視
刪除檢視是指刪除資料庫中已存在的檢視,不會刪除資料
在 MySQL 中,可以使用 DROP VIEW
語句來刪除檢視,但是使用者必須擁有 DROP 許可權
DROP VIEW viewname [viewname1,viewname2,...]