MySQL視圖

在MySQL中,視圖是一張虛擬表,但是它本身並不存儲任何數據。當使用 SQL語句訪問視圖時,它每次返回的數據是從其他表中臨時生成的。在大多數情況下,MySQL中視圖和普通表是被同等對待的,不過,視圖和表還是有差別,比如視圖不能創建觸發器,也不能建立索引等。

一、創建視圖

CREATE [OR REPLACE] [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE ] VIEW v_name AS 查詢語句 [WITH CHECK OPTION] ;

這裏的查詢語句可以是任意的,因此,視圖又分爲單表視圖(即數據來自於一個表)和多表視圖(即數據來自多個表)。

視圖一旦被創建,就會生成一個結構文件 .frm。

創建視圖的兩種算法

視圖的實現可以使用兩種算法,第一種是 merge算法,第二種是 temptable算法。

1.merge(合併算法)

當用戶發起對視圖的查詢時,服務器將視圖 SQL與外部查詢 SQL 合併,然後執行並返回結果給客戶端。這種算法實現的視圖查詢效率較高,但是視圖SQL中如果包含 GROUP BY、DISTINCT、任何聚合函數、UNION、子查詢等時,也就是說如果不能在原表記錄視圖記錄中建立一一映射的場景中,MySQL都會強制使用臨時表算法來實現視圖。

2.temptable(臨時表算法)

當用戶發起對視圖的查詢時,都將執行視圖的 SQL語句來形成一個臨時表,再用用戶的SQL去臨時表中查詢相關數據。

執行:
CREATE VIEW V1 AS (SELECT * FROM TABLE1 ORDER BY 字段名1);
SELECT * FROM V1 WHERE 條件 ORDER BY 字段名2;

相當於執行:
SELECT * FROM ( SELECT * FROM TABLE1 ORDER BY 字段名1 ) AS TEMP WHERE 條件 ORDER BY 字段名2;

默認情況下,MySQL 會在這兩種算法中選擇一個。

二、查

從視圖中獲取數據時就把它當作一個普通的表就可以了,因此無論是普通查詢還是複雜查詢,視圖都可以勝任。

如果想查看視圖結構,SHOW TABLES [LIKE] ‘xxx’、DESC tbl_name、SHOW CREATE TABLE tbl_name、SHOW CREATE VIEW v_name 都是可以的。

三、增刪改

MySQL中可以通過視圖來影響視圖的基表,包括更新、刪除、增加數據。

下列情況下,對視圖數據的增刪改將失敗:

1、新增數據時,由於視圖中沒有的字段在基表中將爲NULL,因此,若該字段爲 NOT NULL並且沒有設置默認值,對視圖的新增就會失敗。
2、如果視圖SQL中包含了 GROUP BY、UNION、聚合函數等,對視圖的增刪改將失敗。
3、如果視圖SQL爲關聯語句,那麼對視圖的增改所涉及到的列必須來自於同一個表中,否則失敗。若來自於一張表,對視圖的操作也只會影響到這一張表。注意,不能對關聯視圖數據進行刪除。
4、創建視圖時,如果加了 WITH CHECK OPTION ,那麼對於視圖的增改,必須使新得到的視圖仍然滿足創建視圖時的 WHERE條件。否則操作將失敗。

對於視圖的管理
刪除視圖:
DROP VIEW [IF EXISTS] v_name;
修改視圖結構:
ALTER VIEW v_name [(字段名1,字段名2,…)] AS (查詢語句)

四、使用視圖的好處

使用視圖可以簡化開發,將一些複雜的SQL語句保存爲視圖,之後的操作都可以對視圖進行。並且,視圖可以實現基於列的權限控制,對外選擇性地提供數據,而不用去真正地在系統中創建列權限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章