CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
OR REPLACE:視圖存在時替換,需具備 DELETE 權限select_statement:定義視圖的 SELECT 查詢,可引用基礎表或其他視圖CREATE VIEW 權限及查詢涉及欄位的 SELECT 權限db_name.view_nameSELECT 清單column_list 明確指定別名,數量必須與查詢欄位數一致db_name.table_name 跨庫引用SELECT 甚至可不引用任何表(如僅計算運算式)mysql> CREATE TABLE t (qty INT, price INT); mysql> INSERT INTO t VALUES(3, 50); mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t; mysql> SELECT * FROM v; +------+-------+-------+ | qty | price | value | +------+-------+-------+ | 3 | 50 | 150 | +------+-------+-------+
FROM 子句中不可包含子查詢CHECK TABLE 檢測)TEMPORARY 表,亦不可建立 TEMPORARY 視圖ORDER BY,但若外層查詢也有 ORDER BY,視圖內部的會被忽略LIMIT、ALL/DISTINCT、INTO、FOR UPDATE 等選項與外層查詢合併時效果未定義,建議避免在視圖定義中使用mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65)); mysql> SET NAMES 'latin1'; SELECT * FROM v; -- latin1 / latin1_swedish_ci mysql> SET NAMES 'utf8'; SELECT * FROM v; -- utf8 / utf8_general_ci
視圖儲存的是查詢定義而非結果,執行時依當前會話環境解析。
| 值 | 處理方式 | 特性 |
|---|---|---|
| MERGE | 將視圖定義合併進外層查詢 | 通常效率較高,支援可更新視圖 |
| TEMPTABLE | 先將視圖結果存入暫存表 | 可較早釋放底層表鎖,但視圖不可更新 |
| UNDEFINED | MySQL 自動選擇(優先 MERGE) | 預設值 |
DISTINCT、GROUP BY、HAVINGUNION / UNION ALL需滿足一對一關係(視圖列對應底層表列),且不包含:
DISTINCT、GROUP BY、HAVING、UNIONJOIN、不可更新視圖WHERE 子查詢引用 FROM 表ALGORITHM = TEMPTABLEcol1+3、UPPER(col2)、子查詢)混合簡單與衍生欄位的視圖不可插入,但可更新非衍生欄位。
MERGE 處理,且使用內部連接(非外部連接/UNION)SET 子句僅引用該表欄位)INSERT 僅支援單表插入,DELETE 不支援WHERE 條件的列LOCAL:僅檢查當前視圖條件CASCADED(預設):遞迴檢查底層視圖條件CREATE TABLE t1 (a INT); CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2 WITH CHECK OPTION; CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0 WITH LOCAL CHECK OPTION; CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0 WITH CASCADED CHECK OPTION; INSERT INTO v2 VALUES (2); -- 成功(僅檢查 v2: a>0) INSERT INTO v3 VALUES (2); -- 失敗(同時檢查 v3:a>0 與 v1:a<2)
updatable_views_with_limit影響帶 LIMIT 的可更新視圖行為,詳見官方文檔。