視圖核心特性
- 虛擬表,不儲存數據,查詢時動態執行定義 SQL。
- 列可來自多表,隱藏敏感欄位(如薪資),提升安全性與復用性。
- 建立/刪除視圖不影響基表;更新視圖會同步反映到基表。
- 多表視圖(含 JOIN/UNION/子查詢)不可 INSERT/DELETE,單表視圖通常可更新。
創建視圖語法與分類範例
CREATE VIEW view_name AS SELECT ...
| 類型 | 範例 | 說明 |
| 常量視圖 | CREATE VIEW v_pi AS SELECT 3.1415926; | 封裝標量值 |
| 聚合視圖 | CREATE VIEW v_stu_cnt AS SELECT COUNT(*) FROM t_student; | COUNT/SUM/AVG 等 |
| 排序視圖 | CREATE VIEW v_stu_desc AS SELECT name FROM t_student ORDER BY id DESC; | 含 ORDER BY |
| 內連接視圖 | CREATE VIEW v_g2 AS SELECT s.name FROM t_student s JOIN t_group g ON s.group_id=g.id WHERE g.id=2; | 等值連接 |
| 外連接視圖 | CREATE VIEW v_g2_left AS SELECT s.name FROM t_student s LEFT JOIN t_group g ON s.group_id=g.id WHERE g.id=2; | LEFT/RIGHT JOIN |
| 子查詢視圖 | CREATE VIEW v_sub AS SELECT name FROM t_student WHERE id IN (SELECT id FROM t_group); | IN/EXISTS 等 |
| UNION 視圖 | CREATE VIEW v_union AS SELECT id,name FROM t_student UNION ALL SELECT id,name FROM t_group; | 合並結果集 |
查看視圖元數據
SHOW TABLES; -- 列出表與視圖名
SHOW TABLE STATUS\G; -- Engine=NULL、Comment=VIEW 區分視圖
SHOW CREATE VIEW view_name\G; -- 完整定義 SQL
DESC view_name; -- 列結構
USE information_schema;
SELECT * FROM VIEWS WHERE TABLE_NAME='view_name'\G;
修改與刪除
-- 方式一:刪後重建(視圖無數據,開銷極小)
DROP VIEW v_old; CREATE VIEW v_old AS SELECT ...;
-- 方式二:原子替換(推薦)
CREATE OR REPLACE VIEW v_name AS SELECT ...;
-- 方式三:ALTER
ALTER VIEW v_name AS SELECT ...;
-- 刪除多個
DROP VIEW v1, v2, v3;
通過視圖操作基表數據
- 查詢:
SELECT * FROM view_name WHERE ...(同表)。
- 更新:
UPDATE view_name SET col=val WHERE ... → 實際更新基表。
- 限制:多基表視圖禁止
INSERT/DELETE;含聚合/分組/UNION 的視圖不可更新。