首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL視圖全攻略:創建/查詢/修改/更新/刪除、算法選擇、安全性與元數據檢視實戰

     編輯:MySQL 資料庫相關知識

視圖本質

虛擬表:僅存儲SELECT定義,不存儲數據。查詢視圖時,實時從基表獲取數據。基表變更,視圖即時反映。

核心作用

  1. 簡化操作:封裝複雜 JOIN/WHERE/聚合,業務直接SELECT * FROM v_report
  2. 安全隔離:暴露特定列/行,隱藏敏感字段(薪資、身份證)
  3. 邏輯解耦:基表結構變更(增列、重命名),只需修改視圖定義,應用代碼無感

創建視圖語法全解析

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

算法選擇(ALGORITHM)

  • MERGE(默認優先):將視圖SQL與外層查詢合併重寫,直接查基表,**性能最優**,支持可更新視圖
  • TEMPTABLE:將視圖結果物化到臨時表,再查臨時表。用於含聚合/DISTINCT/GROUP BY等無法合併的視圖,**不可更新**
  • UNDEFINED:MySQL自動選擇(優先MERGE)

檢查選項(CHECK OPTION)

  • LOCAL:僅檢查當前視圖定義條件
  • CASCADED(默認):遞歸檢查所有關聯視圖條件,**安全性最高**,推薦

實戰操作

單表視圖

CREATE VIEW work_view (ID, NAME, ADDR) 
AS SELECT id, name, address FROM work;

多表視圖(含算法與檢查選項)

CREATE ALGORITHM=MERGE VIEW work_view2 (ID, NAME, SALARY)
AS SELECT w.id, w.name, s.salary 
FROM work w JOIN salary s ON w.id = s.id
WITH LOCAL CHECK OPTION;

查詢視圖

SELECT * FROM work_view;
DESCRIBE work_view;           -- 結構信息
SHOW TABLE STATUS LIKE 'work_view'\G  -- Engine=NULL, Comment=VIEW
SHOW CREATE VIEW work_view\G; -- 完整定義

元數據檢視

SELECT * FROM information_schema.views 
WHERE TABLE_SCHEMA='db_name' AND TABLE_NAME='view_name'\G

修改視圖

-- 存在則替換,不存在則創建(極其實用)
CREATE OR REPLACE VIEW work_view (ID, NAME) 
AS SELECT id, name FROM work;

-- ALTER 修改(需完整重寫定義)
ALTER VIEW work_view2 (NAME, SALARY, ADDR)
AS SELECT name, salary, address FROM work w JOIN salary s ON w.id=s.id;

更新視圖(條件嚴格)

UPDATE work_view2 SET SALARY=5899 WHERE NAME='張三';
-- 等價於
UPDATE salary SET salary=5899 WHERE id=1;

可更新視圖限制:無聚合、無DISTINCT、無GROUP BY、無UNION、無子查詢、基表無衍生列、主鍵包含在視圖中。**生產建議:視圖僅作查詢,更新走基表。**

刪除視圖

DROP VIEW [IF EXISTS] view_name [, view_name2 ...];

視圖是數據庫對外服務的API門面,善用MERGE算法與CASCADED CHECK OPTION,實現安全、高性能、可維護的數據訪問層。

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