視圖是從一個或多個表中導出來的虛擬表。這是因為視圖返回的結果集的一般格式和由列和行組成的表相似,並且在SQL語句中引用視圖的方式也與引用表的方式相同。
一、視圖概述
視圖是從一個或多個基本表或視圖中導出的虛擬表,是從現有基表中抽取若干子集組成用戶的專用表,這種構造方式必須使用SQL中的 SELECT 語句實現。在定義一個視圖時,只是把其定義放在數據庫中,並不直接存儲視圖對應的數據,知道用戶使用視圖時采取查找對應的數據。
使用視圖具有如下優點:
1.1 簡化對數據的操作。視圖可以簡化用戶操作數據的方式。可將經常使用的鏈接、投影、聯合查詢的選擇查詢定義為視圖,這樣在每次執行相同查詢時,不必重寫這些復雜的語句,只要一條簡單的查詢視圖語句即可。視圖可向用戶隱藏表與表之間復雜的連接操作。
1.2 自定義數據。視圖能夠讓不同的用戶不同方式看到不同或相同的數據集,即使不同水平的用戶共用同一數據庫時也是如此。
1.3 數據集中顯示。 視圖使用戶着重於其感興趣的某些特定數據或所負責的特定任務,可以提高數據操作效率,同時增強了數據的安全性,因為用戶只能看到視圖內定義的數據,而不是基本表中的數據。
1.4 導入和導出數據。 可以用視圖將視圖導入和導出。
1.5 合並分割數據。 在某些情況下,由於表中數據量太大,在表的設計過程中可能經常對表進行水平分割或垂直分割,這樣表結構的變化會對應用程序造成不良影響。使用視圖就可以重新保持原有的數據關系,從而使外模式保持不變,原有的應用程序仍可以通過視圖來重載數據。
1.6 安全機制。 視圖可以作為一種安全機制。通過視圖,用戶只能查看和修改他們能看到的數據。其他數據庫或表既不可見也不可訪問。
二、視圖的創建
使用 CREATE VIEW 語句創建視圖,語法格式如下:
create view <視圖名> as <select語句>;
語法說明如下:<視圖名>
:指定視圖的名稱。該名稱在數據庫中必須是唯一的,不能與其他表或視圖同名。<SELECT語句>
:指定創建視圖的 SELECT 語句,可用於查詢多個基礎表或源視圖。
對於創建視圖的 SELECT 語句有如下限制:
- 用戶除了擁有 CREATE VIEW 權限外,還具有操作中涉及的基礎表和其他視圖的相關權限。
- SELECT 語句不能引用系統或用戶變量。
- SELECT 語句不能包含 FROM 子句中的子查詢。
- SELECT 語句不能引用預處理語句參數。
2.1 創建基於單表的視圖
表明 tb_students_info
字段 id | name | dept_id | age | sex | height | login_date
在 tb_students_info 表上創建一個名為 view_students_info 的視圖,輸入的 SQL 語句和執行結果如下所示。
create view view_students_info as select * from tb_students_info;
默認情況下,創建的視圖和基本表的字段是一樣的,也可以通過指定視圖字段的名稱來創建視圖。
在 tb_students_info 表上創建一個名為 v_students_info 的視圖,輸入的 SQL 語句和執行結果如下所示。
create view v_students_info (s_id,s_name,d_id,s_age,s_sex,s_height,s_date) as select id,name,dept_id,age,sex,height,login_date from tb_students;
view_students_info 和 v_students_info 兩個視圖中的字段名稱不同。在使用視圖時,可能用戶不需要了解基本表的結構,更接觸不到實際表中的數據,從而保證了數據庫的安全。
2.2 基於多表創建視圖
create view 視圖名(視圖字段,視圖字段,...) as select 字段,字段,... from 表1,表2 where 表1.字段=表2.字段;
三、視圖的使用
視圖的使用主要包括視圖的檢索,以及通過視圖對基礎表進行插入、修改、刪除操作。視圖的檢索幾乎沒有限制,但是通過視圖實現表的插入、修改、刪除操作則有一定的限制條件。
3.1 使用視圖進行檢索
視圖的查詢總是轉換成對他的基礎表的等價查詢。
3.2 通過視圖修改數據
視圖也可以使用 INSERT 命令插入行,當執行 INSERT 命令時,實際上是向視圖所引用的基礎表插入行。
如果視圖中有下面所述屬性,則插更新、刪除操作將失效。
- 視圖定義中的 FROM 子句包含兩個或多個表,且 SELECT 選擇列表表達式中的列包含來自多個表的列。
- 視圖的列是從集合函數派生的。
- 視圖中的 SELECT 語句包含 GROUP BY 子句或 DISTINCT 選項。
- 視圖的列時從常量或表達式派生的。
視圖使用 DELETE 命令進行刪除。
delete from 視圖名 where 字段=條件:
四、視圖的修改
視圖被創建之后,由於某種原因(如基本表中的列發生了改變,或需要在視圖中增/減若干列等),需要對視圖進行修改。
alter view 視圖名 as select語句 with check option;
五、視圖的刪除
視圖創建之后,可以隨時刪除。當某個視圖被另一個視圖引用,當刪除這個視圖后,如果調用另一個視圖,則會出現錯誤提示。因此,通常基於數據定義視圖,而不是基於視圖來定義視圖。
drop view 視圖名:
DROP VIEW 命令可以刪除多個視圖,各視圖之間用逗號隔離,刪除視圖必須有 DORP 權限。
結束!