SQLServer之視圖篇

1 視圖介紹

         視圖是從一個或者幾個基本表(或視圖)導出的表。它與基本表不同,是一個虛表。數據庫中只存放視圖的定義,而不存在視圖對應的數據,這些數據仍然存放在原來的基本表中。所以一旦基本表中的數據發生變化,從視圖中查詢的數據也就隨之改變了。從這個意義上講,視圖就像一個窗口,透過它可以看到數據庫中自己感興趣的數據及其變化。
1.1 視圖的概述

      視圖是從一個或者多個表導出的,它的行爲與表非常相似,但視圖是一個虛擬表,在視圖中可以使用SELECT語句查詢數據,以及使用insert、update和delete語句修改記錄,對於視圖的操作最終轉化爲對基本數據表的操作。視圖不僅可以方便操作,而且可以保障數據庫系統的安全性。

 視圖一經定義便存儲在數據庫中,與其相對應的數據並沒有像表數據那樣在數據庫中在存儲一份,通過視圖看到的數據只是存放在基本表中的數據。可以對其進行增刪該查,通過視圖對數據修改,基本表數據也對應變化,反之亦然。

1.2 使用視圖的目的與好處

1.聚焦特定數據:使用戶只能看到和操作與他們有關的數據,提高了數據的安全性。
2.簡化數據操作:使用戶不必寫複雜的查詢語句就可對數據進行操作。
3.定製用戶數據:使不同水平的用戶能以不同的方式看到不同的數據。
4.合併分離數據:視圖可以從水平和垂直方向上分割數據,但原數據庫的結構保持不變。

2 創建視圖

語法:
 [ with check option ] --強制所有通過是同修改的數據,都要滿足select語句中指定的條件
select查詢語句
as
[ with encryption ] --用於加密視圖的定義,用戶只能查看不能修改。
[ (列名錶) ]
create view 視圖
先創建一個學生表
use marvel_db;
--創建一個學生表
create table stuTable(
    id int identity(1,1)primary key,--id 主鍵,自增
    name varchar(20),
    gender char(2),
    age int,
)
--往表中插入數據
insert into stuTable (name,gender,age)
values
    ('劉邦','男',23),
    ('項羽','男',22),
    ('韓信','男',21); 
insert into stuTable(name,gender,age) values('蕭何','男',24)  
創建視圖
--創建視圖
if (exists (select * from sys.objects where name = 'stu_view'))
    drop view stu_view
go
--stu_view()不實用參數,默認爲基礎表中的列名稱
--注意 create view 必須是批處理裏面的語句
create view stu_view 
as 
select name,age from stuTable where age>20;
go
--執行視圖
select * from stu_view;  
查詢結果:


3 修改視圖

go
alter view stu_view 
as
select * from stuTable where age>22;
go
select * from stu_view  
顯示結果:

4 刪除視圖

go
--語法
drop view view_name1,view_name2,......,view_nameN;
--該語句可以同時刪除多個視圖,只要在刪除各視圖名稱之間用逗號分隔即可。
例如:刪除視圖 stu_view
--語法
drop view stu_view;
--該語句可以同時刪除多個視圖,只要在刪除各視圖名稱之間用逗號分隔即可。  
5 通過視圖管理表中的數據
(1).通過視圖向基本表中插入數據

注意:

1.可通過視圖向基表中插入數據,但插入的數據實際上存放在基表中,而不是存放在視圖中。

2.如果視圖引用了多個表,使用insert語句插入的列必須屬於同一個表。

3.若創建視圖時定義了“with check option”選項,則使用視圖向基表中插入數據時,必須保證插入後的數據滿足定義視圖的限制條件。

--(1).通過視圖向基本表中插入數據
go
create view stu_insert_view(編號,姓名,性別,年齡)
as
select id,name,gender,age from stuTable;
go
select * from stuTable;
---插入一條數據
insert into stu_insert_view values('孫權','男',34);
----查看插入記錄之後表中的內容。
select * from stuTable;  
顯示結果:


(2).通過視圖修改基本表的數據

--查看修改之前的數據
select * from stuTable;
  
顯示結果:


--修改數據
update stu_insert_view set 年齡=30 where 姓名='劉邦';
--查看修改後的數據
select * from stuTable;  
結果顯示:

(3).通過視圖刪除基本表的數據

注意:

1.要刪除的數據必須包含在視圖的結果集中。

2.如果視圖引用了多個表時,無法用delete命令刪除數據。

語法

--語法
delete stu_insert_view where condition;
  

刪除之前:


刪除:

--例子
delete stu_insert_view where 姓名 ='劉邦';
select * from stu_insert_view;
select * from stuTable;  
顯示結果:

6總結

1.使用場景:
1.經常用到的查詢,或較複雜的聯合查詢應當創立視圖,這是會優化性能的
2.涉及到權限管理方面,比如某表中的部分字段含有機密信息,不應當讓低權限的用戶訪問到的情況,這時候給這些用戶提供一個適合他們權限的視圖,供他們閱讀自己的數據就行了。

2.視圖與表的區別:

1.視圖是已經編譯好的SQL語句,是基於SQL語句的結果集的可視化表,而表不是;
2.視圖(除過索引視圖)沒有實際的物理記錄,而基本表有;
3.表示內容,視圖是窗口;
4.表佔物理空間,而視圖不佔物理空間,視圖只是邏輯概念的存在;
5.視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,只是一些SQL語句的集合。從安全角度說,視圖可以防止用戶接觸數據表,從而不知表結構;
6.表屬於全局模式的表,是實表;視圖數據局部模式的表,是虛表;
7.視圖的建立和刪除隻影響視圖本身,不影響對應的基本表。


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