視圖是虛擬表,不儲存實際數據,僅保存查詢定義。本文系統整理 MySQL 視圖的完整語法、增刪改查限制、字段別名技巧、依賴表結構變更風險及權限模型。
CREATE VIEW view_name AS SELECT_stmt;
-- 例:提取水果重量 ≤ 12 的記錄
CREATE VIEW v_fruit AS SELECT name, place, weight FROM t_fruit WHERE weight <= 12;
CREATE VIEW v_fruit AS SELECT name AS myname, place AS myplace, weight FROM t_fruit ...CREATE VIEW v_fruit (myname, myplace, weight) AS SELECT name, place, weight FROM t_fruit ...(列數必須一致)JOIN、子查詢(WHERE 子句中)、其他視圖作為來源;FROM 子句直接使用子查詢(CREATE VIEW v AS SELECT ... FROM (SELECT * FROM t) ... 報錯)。
CREATE VIEW v_fruit AS SELECT ... WHERE weight <= 12 WITH CHECK OPTION;
插入/更新視圖時強制滿足 WHERE 條件,防止「視圖可見數據」外的資料寫入底表。
SELECT:完全透明,等同查詢底表;INSERT/UPDATE/DELETE:受限極多,常見失敗場景:
SUM、COUNT 等)、表達式、常數;NOT NULL 無預設值列且視圖未包含該列;DISTINCT、GROUP BY、UNION、子查詢等。核心原則:視圖主要用於簡化查詢、權限隔離、業務封裝,非用於數據修改入口。
-- 方式 1:ALTER VIEW
ALTER VIEW v_fruit AS SELECT place AS myplace, weight FROM t_fruit WHERE weight <= 12;
-- 方式 2:CREATE OR REPLACE VIEW(不存在則創建,存在則替換)
CREATE OR REPLACE VIEW v_fruit AS SELECT place AS myplace, weight FROM t_fruit WHERE weight <= 12;
DROP VIEW [IF EXISTS] view_name [, view_name2 ...];
IF EXISTS 避免不存在報錯;DROP VIEW v1, v2, v3; 部分不存在時其餘仍刪除,配合 IF EXISTS 靜默處理。
DESCRIBE view_name; -- 或 DESC view_name;
SHOW CREATE VIEW view_name; -- 顯示完整建視圖 DDL
視圖定義在創建時將 * 展開為具體列名,**不會自動同步**底表結構變更:
Unknown column;* 重建)。運維建議:
SELECT *,顯式列出列名;SELECT * FROM information_schema.VIEWS WHERE VIEW_DEFINITION LIKE '%table_name%');