MySQL 5.1+ 引入視圖功能,本文提供視圖全生命周期操作指南:完整創建語法、三大算法選擇、OR REPLACE 修改技巧、CHECK OPTION 約束、刪除與查看命令、10 大創建限制、實戰案例(產品-採購明細視圖),幫你從零掌握視圖開發。
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
OR REPLACEDROP + CREATE,需 DROP VIEW 權限ALGORITHMcolumn_listWITH CHECK OPTIONCASCADED(默認)向下傳遞,LOCAL 僅當前視圖CREATE TABLE product (
product_id INT NOT NULL,
name VARCHAR(50) NOT NULL,
price DOUBLE NOT NULL
);
INSERT INTO product VALUES (1, 'apple', 5.5);
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 purchase VALUES (1, 1, 10, NOW());
CREATE OR REPLACE VIEW purchase_detail AS
SELECT
p.name AS name,
p.price AS price,
pu.qty AS 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 VIEW purchase_detail AS
SELECT
p.name AS name,
p.price AS price,
p.price * pu.qty AS total_value
FROM product p
JOIN purchase pu ON p.product_id = pu.product_id;
-- 刪除單個/多個視圖
DROP VIEW [IF EXISTS] purchase_detail;
DROP VIEW IF EXISTS v1, v2, v3;
-- 查看視圖定義(格式化輸出)
SHOW CREATE VIEW purchase_detail\G
-- 區分視圖與基表
SHOW FULL TABLES;
+----------------+------------+
| Tables_in_test | Table_type |
+----------------+------------+
| product | BASE TABLE |
| purchase | BASE TABLE |
| purchase_detail| VIEW |
+----------------+------------+
CREATE VIEW 權限,OR REPLACE 額外需 DROP VIEWSELECT 不能包含 FROM 子查詢(5.7+ 已放寬)@var)TEMPORARY 表,不能創建臨時視圖ORDER BY 若外層也有 ORDER BY 會被忽略僅當滿足 全部 條件時可 INSERT/UPDATE/DELETE 視圖:
MERGEv_ 前綴GRANT SELECT ON db.v_view TO 'app'@'%';ALGORITHM=TEMPTABLE 減少鎖持有時間CHECK TABLE v_name 檢測基表缺失導致的視圖失效視圖是邏輯解耦層,善用它讓業務 SQL 更簡潔、安全、可維護。