數據庫中的視圖是一個虛擬表。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據,行和列數據用來自由定義視圖和查詢所引用的表,並且在引用視圖時動態產生。本篇將通過一些實例來介紹視圖的概念,視圖的作用,創建視圖,查看視圖,修改視圖,更新和刪除視圖等SQL Server的數據庫知識。
一:視圖的概述
視圖是從一個或者多個表導出的,它的行為與表非常相似,但視圖是一個虛擬表,在視圖中可以使用SELECT語句查詢數據,以及使用insert、update和delete語句修改記錄,對於視圖的操作最終轉化為對基本數據表的操作。視圖不僅可以方便操作,而且可以保障數據庫系統的安全性。
視圖一經定義便存儲在數據庫中,與其相對應的數據並沒有像表數據那樣在數據庫中在存儲一份,通過視圖看到的數據只是存放在基本表中的數據。可以對其進行增刪該查,通過視圖對數據修改,基本表數據也對應變化,反之亦然。
二:視圖的分類
SQL Server的視圖可以分為3類,分別是:標准視圖,索引視圖,分區視圖
2.1.標准視圖
標准視圖組合了一個或多個表中的數據,可以獲得使用視圖中的大多數好處,包括重點將放在特定的數據上及簡化數據操作。
2.2.索引視圖
索引視圖是被具體化了的視圖,即它已經經過計算並存儲。可以為視圖創建索引,對視圖創建一個唯一的聚集索引。索引視圖可以顯著提高某些類型查詢的性能,索引視圖尤其適於聚合許多行的查詢,但它們不太適於經常更新的基本數據集。
2.3.分區視圖
分區視圖在一台多多台服務器間水平連接一組成員表的分區數據,這樣,數據看上去如同來自一個表。連接本地同一個SQL Server實例中的成員表的視圖是一個本地區分視圖。
三:視圖的優點和作用
與直接從表中讀取數據相比,視圖具有一下優點
3.1.簡單化
看到的就是需要的,視圖不僅可以簡化用戶對數據的理解,也可以簡化對它們的操作,那些經常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的每次操作指定全部的條件。
3.2.安全性
視圖可以作為一種安全機制。通過視圖用戶只能查看和修改他們所能看到的數據。其它或表既不可見也不可以訪問。如果某一用戶想要訪問視圖的,必須授予其訪問權限。視圖所引用表的訪問權限與視圖權限的設置互不影響。
3.3.邏輯數據獨立性
視圖可以幫助用戶屏蔽真實表結構變化帶來的影響。
四:視圖的基本操作和語法
4.1.創建視圖
--語法 CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
測試數據准備:
use sample_db; create table studentTable( id int identity(1,1)primary key, name varchar(20), gender char(2), age int, ) insert into studentTable (name,gender,age) values ('劉備','男',28), ('張飛','男',24), ('關羽','男',26);
--創建視圖 if (exists (select * from sys.objects where name = 'student_view')) drop view student_view go --student_view()不實用參數,默認為基礎表中的列名稱 create view student_view as select name,age from studentTable where age>24; --執行視圖 select * from student_view;
查看視圖的信息
- 使用sp_help存儲過程查看視圖的定義信息
- 使用sp_helptext系統存儲過程使用來顯示規則,默認值,未加密的存儲過程,用戶定義函數,觸發器或視圖的文本,語法
exec sp_help 'student_view'; exec sp_helptext 'student_view';
創建加密視圖:
--加密視圖 if (exists (select * from sys.objects where name = 'student_encryption')) drop view student_encryption go create view student_encryption with encryption --加密 as select id, name, age from studentTable go --view_definition is null --查看加密視圖 select * from information_schema.views where table_name like 'student_encryption';
從執行結果可看出view_definition字段為 NULL
4.2.使用視圖修改基本表數據
(1).通過視圖向基本表中插入數據
--(1).通過視圖向基本表中插入數據 create view stu_insert_view(編號,姓名,性別,年齡) as select id,name,gender,age from studentTable; go select * from studentTable; ---插入一條數據 insert into stu_insert_view values('曹操','男',40); ----查看插入記錄之后表中的內容。 select * from studentTable;
(2).通過視圖修改基本表的數據
--(2).通過視圖修改基本表的數據 --查看修改之前的數據 select * from studentTable; --修改數據 update student_view set age=30 where name='劉備'; --查看修改后的數據 select * from studentTable;
(3).通過視圖刪除基本表的數據
--語法 delete view_name where condition; --例子 delete student_view where name ='張飛'; select * from student_view; select * from studentTable;
4.3.修該視圖
--修改視圖 alter view student_view as select * from studentTable where age>26;
4.4.刪除視圖
--語法 drop view view_name1,view_name2,......,view_nameN; --該語句可以同時刪除多個視圖,只要在刪除各視圖名稱之間用逗號分隔即可。 drop view studentTable;
五:視圖和表的區別
- 視圖是已經編譯好的SQL語句,是基於SQL語句的結果集的可視化表,而表不是;
- 視圖(除過索引視圖)沒有實際的物理記錄,而基本表有;
- 表示內容,視圖是窗口;
- 表占物理空間,而視圖不占物理空間,視圖只是邏輯概念的存在;
- 視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,只是一些SQL語句的集合。從安全角度說,視圖可以防止用戶接觸數據表,從而不知表結構;
- 表屬於全局模式的表,是實表;視圖數據局部模式的表,是虛表;
- 視圖的建立和刪除只影響視圖本身,不影響對應的基本表。