虛擬表:僅存儲SELECT定義,不存儲數據。查詢視圖時,實時從基表獲取數據。基表變更,視圖即時反映。
SELECT * FROM v_reportCREATE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(col_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
MERGE(默認優先):將視圖SQL與外層查詢合併重寫,直接查基表,**性能最優**,支持可更新視圖TEMPTABLE:將視圖結果物化到臨時表,再查臨時表。用於含聚合/DISTINCT/GROUP BY等無法合併的視圖,**不可更新**UNDEFINED:MySQL自動選擇(優先MERGE)LOCAL:僅檢查當前視圖定義條件CASCADED(默認):遞歸檢查所有關聯視圖條件,**安全性最高**,推薦CREATE VIEW work_view (ID, NAME, ADDR)
AS SELECT id, name, address FROM work;
CREATE ALGORITHM=MERGE VIEW work_view2 (ID, NAME, SALARY)
AS SELECT w.id, w.name, s.salary
FROM work w JOIN salary s ON w.id = s.id
WITH LOCAL CHECK OPTION;
SELECT * FROM work_view;
DESCRIBE work_view; -- 結構信息
SHOW TABLE STATUS LIKE 'work_view'\G -- Engine=NULL, Comment=VIEW
SHOW CREATE VIEW work_view\G; -- 完整定義
SELECT * FROM information_schema.views
WHERE TABLE_SCHEMA='db_name' AND TABLE_NAME='view_name'\G
-- 存在則替換,不存在則創建(極其實用)
CREATE OR REPLACE VIEW work_view (ID, NAME)
AS SELECT id, name FROM work;
-- ALTER 修改(需完整重寫定義)
ALTER VIEW work_view2 (NAME, SALARY, ADDR)
AS SELECT name, salary, address FROM work w JOIN salary s ON w.id=s.id;
UPDATE work_view2 SET SALARY=5899 WHERE NAME='張三';
-- 等價於
UPDATE salary SET salary=5899 WHERE id=1;
可更新視圖限制:無聚合、無DISTINCT、無GROUP BY、無UNION、無子查詢、基表無衍生列、主鍵包含在視圖中。**生產建議:視圖僅作查詢,更新走基表。**
DROP VIEW [IF EXISTS] view_name [, view_name2 ...];
視圖是數據庫對外服務的API門面,善用MERGE算法與CASCADED CHECK OPTION,實現安全、高性能、可維護的數據訪問層。