視圖是儲存於資料庫中的 SELECT 查詢,不儲存實體資料,提供安全隔離、簡化複雜查詢、邏輯資料獨立性三大價值。本文系統整理概念、建立/修改語法、權限需求、限制條件與實戰範例。
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW [db_name.]view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
| 選項 | 說明 |
|---|---|
OR REPLACE | 視圖已存在時覆蓋,需同時具備 DROP VIEW 權限 |
ALGORITHM | MERGE(預設,合併查詢)、TEMPTABLE(物化暫存表)、UNDEFINED(由優化器決定) |
column_list | 明確指定輸出欄位名,避免 SELECT * 帶來的隱性耦合 |
WITH CHECK OPTION | 插入/更新時檢查是否符合視圖 WHERE 條件;CASCADED(預設)遞歸檢查底層視圖,LOCAL 僅檢查當前視圖 |
CREATE TABLE product (
product_id INT NOT NULL,
name VARCHAR(50) NOT NULL,
price DOUBLE NOT NULL
);
CREATE TABLE purchase (
id INT NOT NULL,
product_id INT NOT NULL,
qty INT NOT NULL DEFAULT 0,
gen_time DATETIME NOT NULL
);
INSERT INTO product VALUES (1, 'apple', 5.5);
INSERT INTO purchase VALUES (1, 1, 10, NOW());
CREATE VIEW purchase_detail AS
SELECT p.name, p.price, pu.qty, p.price * pu.qty AS total_value
FROM product p
JOIN purchase pu ON p.product_id = pu.product_id;
SELECT * FROM purchase_detail;
+-------+-------+-----+-------------+
| name | price | qty | total_value |
+-------+-------+-----+-------------+
| apple | 5.5 | 10 | 55 |
+-------+-------+-----+-------------+
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
ALTER VIEW purchase_detail AS
SELECT p.name, p.price, p.price * pu.qty AS total_value
FROM product p
JOIN purchase pu ON p.product_id = pu.product_id;
CREATE VIEW 權限;OR REPLACE 額外需 DROP VIEW。SELECT 不可包含 FROM 子查詢(MySQL 5.7+ 已放寬,但建議避免)。@var)。?)。CHECK TABLE 會報錯。TEMPORARY 表,不可建立 TEMPORARY VIEW。ORDER BY 允許但外層查詢若也有 ORDER BY 會覆蓋內層。視圖滿足下列條件時可直接 INSERT/UPDATE/DELETE(操作會同步反映至基礎表):
price * qty)NOT NULL 且無預設值的欄位未包含在視圖中column_list,避免 SELECT * 導致結構變更衝擊。SELECT * FROM v_report WHERE ...。CHECK TABLE view_name 驗證基礎表存在性。善用視圖,讓資料庫承擔更多業務邏輯封裝,應用層更乾淨、安全。