萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 視圖 入門到精通:建立、修改、刪除與實戰範例

什麼是視圖?

視圖是虛擬表,不儲存實際資料,僅保存 SELECT 定義。查詢視圖時,MySQL 將定義展開並執行。基礎表資料變動,視圖即時反映。

視圖三大優勢

  1. 簡化複雜查詢:將多表 JOIN、子查詢封裝為單一視圖,應用層如查單表。
  2. 資料安全隔離:開發人員只授權視圖,不暴露基礎表結構與敏感欄位。
  3. 邏輯集中維護:業務邏輯變更只需 ALTER VIEW,無須修改所有應用 SQL。

視圖演算法類型

演算法行為適用場景
MERGE將視圖定義合併到外部查詢,直接操作基礎表簡單視圖、需可更新視圖
TEMPTABLE先將視圖結果寫入暫存表,再查詢暫存表含聚合、DISTINCT、LIMIT 等無法合併的視圖
UNDEFINED(預設)MySQL 自動選擇,優先 MERGE大多數情況

建立視圖語法

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

實例:建立 MERGE 視圖

USE test;
CREATE ALGORITHM = MERGE VIEW aaa AS SELECT * FROM user;

檢視 .frm 檔案可見:

TYPE=VIEW
query=select `test`.`user`.`id` AS `id`, ...
updatable=1
algorithm=2  -- 2=MERGE

視圖無 .MYD/.MYI 檔案,確認資料仍在基礎表。

修改視圖

ALTER ALGORITHM = MERGE VIEW aaa
AS SELECT * FROM user WHERE id <> ANY (SELECT u_id FROM comment);

查看與刪除

-- 查看資料
SELECT * FROM aaa;

-- 查看定義
SHOW CREATE VIEW aaa\G

-- 刪除
DROP VIEW aaa;

進階:可更新視圖條件

視圖可更新需滿足:

  • 使用 MERGE 演算法。
  • 無聚合函數、DISTINCT、GROUP BY、HAVING、UNION、子查詢(FROM 子句)。
  • SELECT 清單不含衍生欄位(如 id+1)。
  • 基礎表有主鍵,且視圖包含主鍵欄位。

實戰建議

  1. 命名規範:v_<業務域>_<用途>,如 v_order_summary。
  2. 授權策略:GRANT SELECT ON v_* TO dev_role;,基礎表僅授權 DBA。
  3. 效能:視圖嵌套不超過 2 層;大數據量視圖加 ALGORITHM=TEMPTABLE 避免臨時表爆炸。
  4. 文檔:在 COMMENT 記錄業務用途、基礎表、維護人。
copyright © 萬盛學電腦網 all rights reserved