概述 資料庫中關於數據的查詢有時非常複雜,例如表連接、子查詢等,這種查詢編寫難度大,很容易出錯。另外,在具體操作表時,有時候要求只能操作部分欄位。 為了提高複雜 SQL 語句的復用性和表的操作的安全性,MySQL 提供了視圖特性。所謂視圖,本質上是一種虛擬表,同樣包含一系列帶有名稱的列和行數據。行和 ...
概述
資料庫中關於數據的查詢有時非常複雜,例如表連接、子查詢等,這種查詢編寫難度大,很容易出錯。另外,在具體操作表時,有時候要求只能操作部分欄位。
為了提高複雜 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,...]