視圖是虛擬表,其內容由查詢定義動態生成,不存儲物理數據。合理使用視圖能簡化操作、多角度看數據、提供邏輯獨立性、保護敏感數據。本文系統講解視圖原理、語法、用法與避坑指南。
CREATE TABLE t_employee ( ID INT PRIMARY KEY AUTO_INCREMENT, NAME CHAR(30) NOT NULL, SEX CHAR(2), AGE INT, DEPARTMENT CHAR(10), SALARY INT, HOME CHAR(30), MARRY CHAR(2) DEFAULT '否', HOBBY CHAR(30) ); CREATE TABLE t_employee_detail ( ID INT PRIMARY KEY, POS CHAR(10), EXPERENCE CHAR(10), CONSTRAINT FK_ID FOREIGN KEY(ID) REFERENCES t_employee(ID) );
插入 7 條測試數據(含人事、研發、銷售三部門)。
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW [db_name.]view_name [(column_list)]
AS select_statement
[WITH [CASCADED|LOCAL] CHECK OPTION];
OR REPLACE:同名視圖存在時覆蓋。ALGORITHM:MERGE(合併查詢,可更新)、TEMPTABLE(生成臨時表,不可更新)、UNDEFINED(默認,優化器決定)。WITH CHECK OPTION:插入/更新時強制滿足視圖 WHERE 條件。LOCAL僅檢查本視圖,CASCADED(默認)遞歸檢查所有關聯視圖。CREATE VIEW V_VIEW1(ID, NAME, SEX, AGE, DEPARTMENT) AS SELECT ID, NAME, SEX, AGE, DEPARTMENT FROM t_employee;
CREATE VIEW V_VIEW2(ID, NAME, SEX, AGE, DEPARTMENT, POS, EXPERENCE) AS SELECT a.ID, a.NAME, a.SEX, a.AGE, a.DEPARTMENT, b.POS, b.EXPERENCE FROM t_employee a JOIN t_employee_detail b ON a.ID=b.ID;
DESCRIBE V_VIEW2; -- 列結構 SHOW TABLE STATUS LIKE 'V_VIEW2'; -- 類型=VIEW SHOW CREATE VIEW V_VIEW2; -- 完整 DDL
CREATE OR REPLACE VIEW V_VIEW1(ID, NAME, SEX) AS SELECT ID, NAME, SEX FROM t_employee; ALTER VIEW V_VIEW1(ID, NAME) AS SELECT ID, NAME FROM t_employee;
UPDATE V_VIEW2 SET POS='高級工程師' WHERE NAME='天天'; -- 同步更新基表 t_employee_detail
可更新視圖條件:視圖行與基表行一一對應。不可更新場景:含聚合、DISTINCT、GROUP BY、HAVING、UNION、子查詢、JOIN、不可更新視圖、僅字面值、ALGORITHM=TEMPTABLE。
CREATE VIEW V_VIEW3 AS SELECT * FROM t_employee WHERE DEPARTMENT='人事部' WITH LOCAL CHECK OPTION;
INSERT INTO V_VIEW3 ... DEPARTMENT='人事部' → 成功INSERT INTO V_VIEW3 ... DEPARTMENT='研發部' → 失敗(違反 CHECK OPTION)規則:通過視圖修改的數據,必須滿足視圖定義條件(即修改後仍可被視圖查出)。
DROP VIEW IF EXISTS view_name;
SELECT SELECT_priv, create_view_priv FROM mysql.user WHERE user='root'; -- Y 表示有權限
視圖權限獨立於基表,可實現「只給視圖權限,不給基表權限」的列級/行級安全。
視圖是「邏輯層面的索引」,用好它能讓數據庫架構更清晰、安全、可維護。