引言
視圖是一種虛擬表,和普通表的使用是一樣的,視圖的一大特點就是“臨時性”,是通過表動態生成的數據,只保存SQL邏輯,不保存查詢結果。
視圖在實際生產中主要有兩種應用場景:
1、多個地方用到同樣的查詢結果;
2、該查詢使用的SQL比較複雜。
下面,我們來總結一下這個在開發中經常會用到的知識點。
一、視圖的優勢
首先,視圖並不能提高SQL的性能,它的作用在於更好的組織數據。優勢有以下幾點:
1、重用SQL語句。
2、簡化複雜的SQL操作,隱藏一部分SQL細節。
3、保護數據,提高安全性。
二、視圖的創建
視圖的創建和表一樣,也用到了 CREATE 關鍵字。
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
忽略可選部分,則:
CREATE 視圖名 AS 查詢語句
查詢語句可以是一個普通表,或者是其他視圖。
CREATE OR REPLACE VIEW limit_emp AS
SELECT
emp_id 員工編號,
emp_name 姓名,
salary 工資,
dept_id 部門編號
FROM
emp ;
查看和使用視圖的方式和普通表完全一樣:
SELECT * FROM limit_emp;
三、查看已創建的視圖
創建好視圖之後,如何查看已創建的視圖呢?如果使用Navicat 或 SQLyog,可以直接在左側的 “表文件夾”下方的“視圖文件夾”查看:
如果希望使用SQL來查看,因爲MySQL認爲視圖也是一種表,所以可以使用如下語句:
SHOW TABLES;
如果想僅查詢出視圖,那麼可以執行:
SHOW TABLE STATUS WHERE COMMENT = 'view';
或者,直接查看指定名稱的視圖:
SHOW CREATE VIEW limit_emp;
四、視圖的修改
視圖的修改可有兩種方式:
1、不確定是否已經存在該視圖,可創建並替換,CREATE OR REPLACE VIEW:
CREATE OR REPLACE VIEW limit_emp
AS
SELECT * FROM emp
2、確定已經存在了該視圖,直接更新 ALTER VIEW:
ALTER VIEW limit_emp
AS
SELECT * FROM emp
五、更新視圖數據
視圖中的數據是允許修改的,如果對視圖執行 INSERT 、UPDATE 、DELETE 不僅對視圖本身有效果,其背後的表也是會有影響的。但在實際生產中,往往會嚴格控制視圖的更新操作,且會將視圖設置爲只讀模式,即只用視圖來簡化查詢,避免通過視圖來對原表進行修改。
雖然視圖可以更新,但是如果創建視圖的語句中包含了以下這些關鍵字,那麼同樣無法執行更新:
1、分組函數、DISTINCT、GROUP BY 子句、HAVING、UNION。
2、常量視圖
3、SELECT 語句中包含子查詢
4、JOIN 子句
5、FROM 一個不能更新的視圖
6、WHERE 子句的子查詢引用了 FROM 子句中的表
六、視圖的刪除
DROP VIEW 視圖名, 視圖名, ...;
七、視圖和表的比較
創建語法關鍵字 | 物理空間佔用 | 使用 | |
表 | CREATE TABLE | 佔用 | 增刪改查 |
視圖 | CREATE VIEW | 不佔用 | 一般只做查詢 |