視圖 是由查詢結果形成的虛擬表,不存儲物理數據,查詢時動態執行底層 SQL。
核心價值:
CREATE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
修改基表數據,查詢視圖即見最新結果(視圖無獨立存儲)。
只有當視圖行與基表行一一對應時,才支持 INSERT/UPDATE/DELETE。
| 場景 | 示例 | 可更新? |
|---|---|---|
| 簡單單表投影 | CREATE VIEW v AS SELECT id, name FROM t | ✅ 是 |
| 聚合統計 | CREATE VIEW v AS SELECT type, SUM(money) FROM t GROUP BY type | ❌ 否(一行對應多行) |
| 包含 JOIN | CREATE VIEW v AS SELECT * FROM t1 JOIN t2 ... | ❌ 通常否 |
| 使用 DISTINCT/UNION/子查詢 | ... | ❌ 否 |
INSERT 額外要求:視圖必須包含基表中無默認值的非空列,否則插入失敗。
| 算法 | 機制 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| MERGE | 將視圖 SQL 與外層查詢合併優化,不產生臨時表 | 性能高,利用索引 | 不支持聚合、DISTINCT 等構造 | 簡單單表視圖 |
| TEMPTABLE | 先將視圖結果物化為臨時表,再查詢 | 支持所有構造 | 需物化開銷,不利用索引 | 聚合、分組、複雜視圖 |
| UNDEFINED | MySQL 自動選擇(優先 MERGE) | 無需手動指定 | 可能選錯導致錯誤/性能差 | 不確定時 |
-- MERGE 視圖:求各 type 最大 money
CREATE ALGORITHM=MERGE VIEW v_merge AS
SELECT type, MAX(money) AS max_money FROM t GROUP BY type;
SELECT * FROM v_merge GROUP BY type; -- 錯誤!外層 GROUP BY 與視圖內合併導致語義變化
-- TEMPTABLE 視圖:正確
CREATE ALGORITHM=TEMPTABLE VIEW v_temp AS
SELECT type, MAX(money) AS max_money FROM t GROUP BY type;
SELECT * FROM v_temp GROUP BY type; -- 正確,先物化再分組
ALGORITHM=TEMPTABLE 避免 MERGE 導致語義錯誤SELECT * 導致結構變更衝擊GRANT SELECT ON view_name TO user,拒絕基表直接訪問ANALYZE TABLE 保持統計信息準確,優化器才能選擇最佳執行計劃