視圖 是虛擬資料表,其內容由 SELECT 查詢動態產生。合理使用視圖可提升安全性、簡化複雜查詢、隔離業務邏輯變更。本文系統講解 MySQL 視圖的建立、查看、修改、更新、刪除及進階特性。
GRANT SELECT ON view_name TO user)。CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
| 選項 | 說明 |
|---|---|
| OR REPLACE | 視圖存在則替換,不存在則建立 |
| ALGORITHM | MERGE:將視圖定義合併到外層查詢(效能佳、可更新) TEMPTABLE:先建立臨時表再查詢(不可更新) UNDEFINED:MySQL 自動選擇(預設,傾向 MERGE) |
| WITH CHECK OPTION | 更新視圖時,確保新資料符合視圖 WHERE 條件 CASCADED(預設):遞迴檢查底層視圖 LOCAL:僅檢查當前視圖 |
CREATE TABLE student (stuno INT, stuname NVARCHAR(60));
CREATE TABLE stuinfo (stuno INT, class NVARCHAR(60), city NVARCHAR(60));
INSERT INTO student VALUES (1,'王林'),(2,'高莉'),(3,'張海');
INSERT INTO stuinfo VALUES (1,'五班','河南'),(2,'六班','河北'),(3,'七班','山東');
CREATE VIEW stu_class (id, name, class) AS
SELECT s.stuno, s.stuname, i.class
FROM student s JOIN stuinfo i ON s.stuno = i.stuno;
DESC stu_class;
顯示欄位定義、型別、是否 NULL、鍵、預設值等。
SHOW TABLE STATUS LIKE 'stu_class';
Comment 欄位為 VIEW 即為視圖,其他欄位多為 NULL(虛表特徵)。
SHOW CREATE VIEW stu_class\G
輸出完整建立語句,含 DEFINER、SQL SECURITY、字符集等元資訊。
SELECT * FROM information_schema.VIEWS WHERE TABLE_NAME = 'stu_class';
可獲取 VIEW_DEFINITION、IS_UPDATABLE、SECURITY_TYPE 等詳細屬性。
CREATE OR REPLACE VIEW stu_class AS
SELECT stuno AS id FROM student JOIN stuinfo ON student.stuno = stuinfo.stuno;
ALTER VIEW stu_class AS SELECT stuno FROM student;
兩者效果相同,ALTER VIEW 語意更明確。
視圖若符合條件,可直接 INSERT、UPDATE、DELETE,操作會轉發至基表。
-- 先調整視圖包含可更新欄位
ALTER VIEW stu_class AS SELECT stuno, stuname FROM student;
UPDATE stu_class SET stuname='小芳' WHERE stuno=2;
INSERT INTO stu_class VALUES (6,'浩傑');
DELETE FROM stu_class WHERE stuno=1;
DISTINCT、UNION、GROUP BY、HAVINGTEMPTABLE 演算法或 ALGORITHM=TEMPTABLEDROP VIEW [IF EXISTS] view_name [, view_name] ...;
支援一次刪除多個視圖,IF EXISTS 避免不存在報錯。
DEFINER:定義視圖的用戶,預設為建立者(CURRENT_USER)SQL SECURITY {DEFINER | INVOKER}:執行權限檢查模式MERGE 演算法,避免臨時表開銷MySQL 視圖是資料庫抽象層的重要工具,善用可大幅提升安全性、維護性與開發效率。關鍵要點:
ALGORITHM,優先 MERGEWITH CHECK OPTION 保護資料完整性DEFINER/INVOKER 權限模型,避免權限提升風險information_schema.VIEWS.IS_UPDATABLE 確認可更新性