首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL View 視圖完整指南:概念、CREATE VIEW、ALTER VIEW、權限與限制條件詳解

     編輯:MySQL 綜合教學

MySQL 視圖:虛擬表的建立、修改與最佳實踐

視圖是儲存於資料庫中的 SELECT 查詢,不儲存實體資料,提供安全隔離、簡化複雜查詢、邏輯資料獨立性三大價值。本文系統整理概念、建立/修改語法、權限需求、限制條件與實戰範例。

一、視圖核心概念

  • 虛擬表:查詢時動態從基礎表取得資料,不佔用額外儲存空間。
  • 安全隔離:可隱藏敏感欄位(如薪資、身分證),僅暴露必要資訊。
  • 簡化複雜性:將多表 JOIN、聚合、子查詢封裝,應用層如操作單表。
  • 資料獨立:基礎表結構變更時,僅需調整視圖定義,應用程式碼不動。

二、CREATE VIEW 語法詳解

完整語法

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 權限
ALGORITHMMERGE(預設,合併查詢)、TEMPTABLE(物化暫存表)、UNDEFINED(由優化器決定)
column_list明確指定輸出欄位名,避免 SELECT * 帶來的隱性耦合
WITH CHECK OPTION插入/更新時檢查是否符合視圖 WHERE 條件;CASCADED(預設)遞歸檢查底層視圖,LOCAL 僅檢查當前視圖

實戰範例:多表 JOIN 封裝

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 VIEW 修改視圖

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  VIEW view_name [(column_list)]
  AS select_statement
  [WITH [CASCADED | LOCAL] CHECK OPTION]

範例:移除 qty 欄位

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;

四、建立視圖的 10 大限制條件(必讀)

  1. 需 CREATE VIEW 權限;OR REPLACE 額外需 DROP VIEW。
  2. SELECT 不可包含 FROM 子查詢(MySQL 5.7+ 已放寬,但建議避免)。
  3. 不可引用系統/用戶變數(@var)。
  4. 不可引用預處理參數(?)。
  5. 預存程序內不可引用程序參數/區域變數。
  6. 參考的表/視圖必須存在;建立後可刪除基礎表,但 CHECK TABLE 會報錯。
  7. 不可參考 TEMPORARY 表,不可建立 TEMPORARY VIEW。
  8. 命名的表必須已存在。
  9. 不可關聯 Trigger。
  10. ORDER BY 允許但外層查詢若也有 ORDER BY 會覆蓋內層。

五、可更新視圖條件

視圖滿足下列條件時可直接 INSERT/UPDATE/DELETE(操作會同步反映至基礎表):

  • 單一基礎表(無 JOIN/UNION/子查詢/聚合/DISTINCT/GROUP BY/HAVING)
  • 無衍生欄位(如 price * qty)
  • 基礎表無 NOT NULL 且無預設值的欄位未包含在視圖中

六、最佳實踐建議

  1. 明確列出 column_list,避免 SELECT * 導致結構變更衝擊。
  2. 複雜報表查詢優先封裝為視圖,應用層簡化為 SELECT * FROM v_report WHERE ...。
  3. 敏感資料(薪資、個資)建立僅含安全欄位的視圖,授權給報表/BI 角色。
  4. 定期 CHECK TABLE view_name 驗證基礎表存在性。
  5. 大量寫入場景勿使用視圖,直接操作基礎表並由應用層維護一致性。

善用視圖,讓資料庫承擔更多業務邏輯封裝,應用層更乾淨、安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved