MySQL之視圖(VIEW)


一、MySQL視圖簡介

視圖是數據庫系統中一種非常有用的數據庫對象。MySQL 5.0 之后的版本添加了對視圖的支持。

認識視圖

視圖是一個虛擬表,其內容由查詢定義。同真實表一樣,視圖包含一系列帶有名稱的列和行數據,但視圖並不是數據庫真實存儲的數據表。

視圖是從一個、多個表或者視圖中導出的表,包含一系列帶有名稱的數據列和若干條數據行。

視圖並不同於數據表,它們的區別在於以下幾點:

  • 視圖不是數據庫中真實的表,而是一張虛擬表,其結構和數據是建立在對數據中真實表的查詢基礎上的。
  • 存儲在數據庫中的查詢操作 SQL 語句定義了視圖的內容,列數據和行數據來自於視圖查詢所引用的實際表,引用視圖時動態生成這些數據。
  • 視圖沒有實際的物理記錄,不是以數據集的形式存儲在數據庫中的,它所對應的數據實際上是存儲在視圖所引用的真實表中的。
  • 視圖是數據的窗口,而表是內容。表是實際數據的存放單位,而視圖只是以不同的顯示方式展示數據,其數據來源還是實際表。
  • 視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,只是一些 SQL 語句的集合。從安全的角度來看,視圖的數據安全性更高,使用視圖的用戶不接觸數據表,不知道表結構。
  • 視圖的建立和刪除只影響視圖本身,不影響對應的基本表。


視圖與表在本質上雖然不相同,但視圖經過定義以后,結構形式和表一樣,可以進行查詢、修改、更新和刪除等操作。同時,視圖具有如下優點:

1) 定制用戶數據,聚焦特定的數據

在實際的應用過程中,不同的用戶可能對不同的數據有不同的要求。例如,當數據庫同時存在時,如學生基本信息表、課程表和教師信息表等多種表同時存在時,可以根據需求讓不同的用戶使用各自的數據。學生查看修改自己基本信息的視圖,安排課程人員查看修改課程表和教師信息的視圖,教師查看學生信息和課程信息表的視圖。

2) 簡化數據操作

在使用查詢時,很多時候要使用聚合函數,同時還要顯示其他字段的信息,可能還需要關聯到其他表,語句可能會很長,如果這個動作頻繁發生的話,可以創建視圖來簡化操作。

3) 提高基表數據的安全性

視圖是虛擬的,物理上是不存在的。可以只授予用戶視圖的權限,而不具體指定使用表的權限,來保護基礎數據的安全。

4) 共享所需數據

通過使用視圖,每個用戶不必都定義和存儲自己所需的數據,可以共享數據庫中的數據,同樣的數據只需要存儲一次。

5) 更改數據格式

通過使用視圖,可以重新格式化檢索出的數據,並組織輸出到其他應用程序中。

6) 重用 SQL 語句

視圖提供的是對查詢操作的封裝,本身不包含數據,所呈現的數據是根據視圖定義從基礎表中檢索出來的,如果基礎表的數據新增或刪除,視圖呈現的也是更新后的數據。視圖定義后,編寫完所需的查詢,可以方便地重用該視圖。

注意:要區別視圖和數據表的本質,即視圖是基於真實表的一張虛擬的表,其數據來源均建立在真實表的基礎上。

使用視圖的時候,還應該注意以下幾點:

  • 創建視圖需要足夠的訪問權限。
  • 創建視圖的數目沒有限制。
  • 視圖可以嵌套,即從其他視圖中檢索數據的查詢來創建視圖。
  • 視圖不能索引,也不能有關聯的觸發器、默認值或規則。
  • 視圖可以和表一起使用。
  • 視圖不包含數據,所以每次使用視圖時,都必須執行查詢中所需的任何一個檢索操作。如果用多個連接和過濾條件創建了復雜的視圖或嵌套了視圖,可能會發現系統運行性能下降得十分嚴重。因此,在部署大量視圖應用時,應該進行系統測試。


ORDER BY 子句可以用在視圖中,但若該視圖檢索數據的 SELECT 語句中也含有 ORDER BY 子句,則該視圖中的 ORDER BY 子句將被覆蓋。

二、MySQL創建視圖(CREATE VIEW)

創建視圖是指在已經存在的 MySQL數據庫表上建立視圖。視圖可以建立在一張表中,也可以建立在多張表中。

基本語法

可以使用 CREATE VIEW 語句來創建視圖。

語法格式如下:

CREATE VIEW <視圖名> AS <SELECT語句>

語法說明如下。

  • <視圖名>:指定視圖的名稱。該名稱在數據庫中必須是唯一的,不能與其他表或視圖同名。
  • <SELECT語句>:指定創建視圖的 SELECT 語句,可用於查詢多個基礎表或源視圖。

對於創建視圖中的 SELECT 語句的指定存在以下限制:

  • 用戶除了擁有 CREATE VIEW 權限外,還具有操作中涉及的基礎表和其他視圖的相關權限。
  • SELECT 語句不能引用系統或用戶變量。
  • SELECT 語句不能包含 FROM 子句中的子查詢。
  • SELECT 語句不能引用預處理語句參數。

視圖定義中引用的表或視圖必須存在。但是,創建完視圖后,可以刪除定義引用的表或視圖。可使用 CHECK TABLE 語句檢查視圖定義是否存在這類問題。

視圖定義中允許使用 ORDER BY 語句,但是若從特定視圖進行選擇,而該視圖使用了自己的 ORDER BY 語句,則視圖定義中的 ORDER BY 將被忽略。

視圖定義中不能引用 TEMPORARY 表(臨時表),不能創建 TEMPORARY 視圖。

WITH CHECK OPTION 的意思是,修改視圖時,檢查插入的數據是否符合 WHERE 設置的條件。

創建基於單表的視圖

MySQL 可以在單個數據表上創建視圖。

查看 test_db 數據庫中的 tb_students_info 表的數據,如下所示。

 

 

 【實例 1】在 tb_students_info 表上創建一個名為 view_students_info 的視圖,輸入的 SQL 語句和執行結果如下所示。

 

 

 默認情況下,創建的視圖和基本表的字段是一樣的,也可以通過指定視圖字段的名稱來創建視圖。

 

 

 可以看到,view_students_info 和 v_students_info 兩個視圖中的字段名稱不同,但是數據卻相同。因此,在使用視圖時,可能用戶不需要了解基本表的結構,更接觸不到實際表中的數據,從而保證了數據庫的安全。

創建基於多表的視圖

MySQL 中也可以在兩個以上的表中創建視圖,使用 CREATE VIEW 語句創建。

【實例 3】在表 tb_student_info 和表 tb_departments 上創建視圖 v_students_info,輸入的 SQL 語句和執行結果如下所示。

 

 

 通過這個視圖可以很好地保護基本表中的數據。視圖中(s_id,s_name,s_age,s_sex,s_height,s_date)對應表s_students_info中(id,name,age,height,login_date)字段,s_dept_name對應表tb_departments中dept_name字段。

三、查詢視圖

視圖一經定義之后,就可以如同查詢數據表一樣,使用 SELECT 語句查詢視圖中的數據,語法和查詢基礎表的數據一樣。

視圖用於查詢主要應用在以下幾個方面:
  • 使用視圖重新格式化檢索出的數據。
  • 使用視圖簡化復雜的表連接。
  • 使用視圖過濾數據。

DESCRIBE 可以用來查看視圖,語法如下:

DESCRIBE 視圖名;

【實例 4】通過 DESCRIBE 語句查看視圖 v_students_info 的定義,輸入的 SQL 語句和執行結果如下所示。

 

 

注意:DESCRIBE 一般情況下可以簡寫成 DESC,輸入這個命令的執行結果和輸入 DESCRIBE 是一樣的。

四、MySQL修改視圖(ALTER VIEW)

修改視圖是指修改 MySQL數據庫中存在的視圖,當基本表的某些字段發生變化時,可以通過修改視圖來保持與基本表的一致性。

基本語法

可以使用 ALTER VIEW 語句來對已有的視圖進行修改。

語法格式如下:

ALTER VIEW <視圖名> AS <SELECT語句>

語法說明如下:
  • <視圖名>:指定視圖的名稱。該名稱在數據庫中必須是唯一的,不能與其他表或視圖同名。
  • <SELECT 語句>:指定創建視圖的 SELECT 語句,可用於查詢多個基礎表或源視圖。

需要注意的是,對於 ALTER VIEW 語句的使用,需要用戶具有針對視圖的 CREATE VIEW 和 DROP 權限,以及由 SELECT 語句選擇的每一列上的某些權限。

修改視圖的定義,除了可以通過 ALTER VIEW 外,也可以使用 DROP VIEW 語句先刪除視圖,再使用 CREATE VIEW 語句來實現。

修改視圖內容

視圖是一個虛擬表,實際的數據來自於基本表,所以通過插入、修改和刪除操作更新視圖中的數據,實質上是在更新視圖所引用的基本表的數據。

注意:對視圖的修改就是對基本表的修改,因此在修改時,要滿足基本表的數據定義。

某些視圖是可更新的。也就是說,可以使用 UPDATE、DELETE 或 INSERT 等語句更新基本表的內容。對於可更新的視圖,視圖中的行和基本表的行之間必須具有一對一的關系。

還有一些特定的其他結構,這些結構會使得視圖不可更新。更具體地講,如果視圖包含以下結構中的任何一種,它就是不可更新的:
  • 聚合函數 SUM()、MIN()、MAX()、COUNT() 等。
  • DISTINCT 關鍵字。
  • GROUP BY 子句。
  • HAVING 子句。
  • UNION 或 UNION ALL 運算符。
  • 位於選擇列表中的子查詢。
  • FROM 子句中的不可更新視圖或包含多個表。
  • WHERE 子句中的子查詢,引用 FROM 子句中的表。
  • ALGORITHM 選項為 TEMPTABLE(使用臨時表總會使視圖成為不可更新的)的時候。

【實例 1】使用 ALTER 語句修改視圖 view_students_info,輸入的 SQL 語句和執行結果如下所示。
修改前view_students_info的內容查詢如下:

 ALTER VIEW修改后查詢結果如下:

 

 【實例 2】使用 UPDATE 語句更新視圖 view_students_info,輸入的 SQL 語句和執行結果如下所示。

 查詢基表tb_students_ifno,發現基表的數據也被修改為了30

修改視圖名稱

修改視圖的名稱可以先將視圖刪除,然后按照相同的定義語句進行視圖的創建,並命名為新的視圖名稱。

五、MySQL刪除視圖(DORP VIEW)

刪除視圖是指刪除 MySQL數據庫中已存在的視圖。刪除視圖時,只能刪除視圖的定義,不會刪除數據。

基本語法

可以使用 DROP VIEW 語句來刪除視圖。

語法格式如下:

DROP VIEW <視圖名1> [ , <視圖名2> …]

其中:<視圖名>指定要刪除的視圖名。DROP VIEW 語句可以一次刪除多個視圖,但是必須在每個視圖上擁有 DROP 權限。

刪除視圖

【實例】刪除 v_students,v2_students,vv_students_info 視圖,輸入的 SQL 語句和執行過程如下所示。

 

 

 可以看到,v_students,v2_students,vv_students_info  視圖已不存在,將其成功刪除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM