一、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 是一樣的。





