萬盛學電腦網

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

MySQL 視圖實戰:多表聯合查詢封裝、CREATE VIEW 語法、ALGORITHM 選擇與權限控制

視圖核心價值

  • 封裝複雜 JOIN/子查詢,對應用呈現簡單虛擬表。
  • 安全控制:只授予視圖 SELECT 權限,隱藏基表敏感欄位。
  • 簡化應用 SQL,減少重複邏輯。

建立範例表與資料

CREATE TABLE employee (
    id INT, first_name VARCHAR(15), last_name VARCHAR(15),
    start_date DATE, end_date DATE, salary FLOAT(8,2),
    city VARCHAR(10), description VARCHAR(15)
) ENGINE=InnoDB;

CREATE TABLE job (
    id INT, title VARCHAR(20)
) ENGINE=InnoDB;

-- 插入測試資料(略,見原文)

建立視圖

CREATE ALGORITHM = TEMPTABLE VIEW myview (id, first_name, title) AS
SELECT o.id, o.first_name, c.title
FROM job c, employee o
WHERE o.id = c.id;

ALGORITHM 三種模式

模式機制適用場景
MERGE將視圖定義合併到外層查詢(預設)簡單視圖、可使用索引、效能最佳
TEMPTABLE先將視圖結果物化到臨時表含聚合、DISTINCT、GROUP BY、UNION 等無法合併時
UNDEFINED由優化器自動選擇不確定時讓優化器決定

查詢視圖

SELECT * FROM myview;
-- 結果:8 筆員工與職稱關聯資料

修改與刪除

-- 修改:需 DROP 再 CREATE,或使用 CREATE OR REPLACE VIEW
CREATE OR REPLACE VIEW myview AS SELECT ...;

-- 刪除
DROP VIEW [IF EXISTS] myview;

可更新視圖條件

符合以下條件的視圖可直接 INSERT/UPDATE/DELETE:

  • 單一基表,無聚合、DISTINCT、GROUP BY、UNION、子查詢。
  • 選單包含基表所有無預設值的 NOT NULL 欄位。
  • 無衍生欄位(運算式、函數)。

權限模型

GRANT SELECT ON db.myview TO 'report_user'@'%';
-- 基表無需授權,實現欄位級/行級安全隔離

效能提醒

  • 視圖不儲存資料,每次查詢即時執行底層 SQL。
  • 巢狀視圖(視圖查視圖)會疊加開銷,慎用。
  • EXPLAIN SELECT * FROM myview 檢查執行計畫,確認索引使用。
copyright © 萬盛學電腦網 all rights reserved