SQL Server建立檢視——檢視的作用
檢視簡介:
檢視可以看作定義在SQL Server上的虛擬表。檢視正如其名字的含義一樣,是另一種檢視資料的入口。
常規檢視本身並不儲存實際的資料,而僅僅是由SELECT語句組成的查詢定義的虛擬表 。
從資料庫系統內部來看,檢視是由一張或多張表中的資料組成的,從資料庫系統外部來看,檢視就如同一張表一樣,對錶能夠進行的一般操作都可以應用於檢視。
例如查詢,插入,修改,刪除操作等,但插入、修改、刪除等的操作其實對於原始資料表的操作。
檢視的作用:
1、檢視隱藏了底層的表結構,簡化了資料訪問操作,客戶端不再需要知道底層表的結構及其之間的關係。
2、檢視提供了一個統一訪問資料的介面。(即可以允許使用者通過檢視訪問資料的安全機制,而不授予使用者直接訪問底層表的許可權)
3、從而加強了安全性,使使用者只能看到檢視所顯示的資料。
4、檢視還可以被巢狀,一個檢視中可以巢狀另一個檢視。
語法:
1 CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ] 2 [ WITH <view_attribute> [ ,...n ] ] 3 AS select_statement 4 [ WITH CHECK OPTION ] 5 [ ; ] 6 7 <view_attribute> ::= 8 { 9 [ ENCRYPTION ] 10 [ SCHEMABINDING ] 11 [ VIEW_METADATA ] 12 } 13 <select_statement> ::= 14 [ WITH <common_table_expression> [ ,...n ] ] 15 SELECT <select_criteria>
引數:
schema_name:是檢視所有者的名稱,一般為 dbo。(指定檢視所有者名稱是可選的。)
view_name:是檢視的名稱。
column:是檢視中用於列的名稱。僅當列從算術表示式,函式或常數派生時,才需要列名稱; 當兩個或多個列可能具有相同的名稱時,通常是因為連線; 或者當檢視中的列被指定與其派生的列的名稱不同的名稱時。列名也可以在 SELECT 語句中分配。如果列未指定,則檢視列獲得相同的名稱作為 SELECT 語句中的列。
AS:指定檢視要執行的操作。
select_statement:是定義檢視的 SELECT 語句。該語句可以使用多個表和其他檢視。需要適當的許可權才能從建立的檢視的 SELECT 子句中引用的物件進行選擇。
ENCRYPTION:對加密進行加密,加密之後不可修改。使用 WITH ENCRYPTION 可以防止將檢視作為 SQL Server 複製的一部分進行釋出。
SCHEMABINDING:將檢視繫結到底層所應用到的表。指定 SCHEMABINDING 時,不能以影響檢視定義的方式修改表。必須首先修改或刪除檢視定義,以刪除要修改的表的依賴關係。使用 SCHEMABINDING 子句建立的檢視的檢視或表不能刪除,除非該檢視被刪除或更改,以使其不再具有繫結。
VIEW_METADATA:當使用 WITH VIEW_METADATA 建立檢視時,返回的是檢視的元資料,否則返回的元資料是檢視所引用表的元資料。
普通檢視:
1 --判斷使用者自定義檢視是否存在 2 if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou') and objectproperty(id,N'IsView')=1) 3 drop view v_Stu_Cou --刪除檢視 4 go 5 create view dbo.v_Stu_Cou --建立檢視 6 as 7 select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name 8 from Student s 9 left join Course c on s.C_S_Id=c.C_Id 10 where s.C_S_Id is not null 11 go 12 13 14 select * from v_Stu_Cou --使用檢視查詢
索引檢視:
1 --判斷使用者自定義檢視是否存在 2 if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou_Index') and objectproperty(id,N'IsView')=1) 3 drop view v_Stu_Cou_Index --刪除檢視 4 go 5 create view dbo.v_Stu_Cou_Index --建立檢視 6 with schemabinding --指定架構繫結 7 as 8 select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name 9 from dbo.Student s 10 inner join dbo.Course c on s.C_S_Id=c.C_Id 11 where s.C_S_Id is not null 12 go 13 14 --在檢視 v_Stu_Cou_Index 上建立唯一的聚集索引 15 create unique clustered index Index_View on v_Stu_Cou_Index(S_StuNo) 16 17 select * from v_Stu_Cou_Index --使用檢視查詢
PS:索引檢視涉及的基本表必須ANSI_NULLS設定為ON。索引檢視必須設定 ANSI_NULLS 和 QUOTED_INDETIFIER 為 ON。索引檢視只能引用基本表。(即不能巢狀檢視)
必須使用 WITH SCHEMABINDING 繫結架構。定義索引檢視時必須使用 Schema.ViewName 這樣的全名。(即需要指定檢視的所有者)
定義索引檢視的表也必須指定所有者,例如:dbo。
定義索引檢視不能使用外連線。(即 left join/left outer join、right join/right outer join、outer join/full outer join)
分割槽檢視:
分割槽檢視是由 UNION ALL 的所有成員表定義的檢視,即擁有相同的表結構、欄位、資料型別等,不相同的資料集。
分割槽檢視又分為 本地式分割槽檢視和分散式分割槽檢視,我的理解就是本地式分割槽檢視就是同一個資料庫存在相同的表結構、欄位、資料型別等的表使用 UNION ALL 建立的檢視;
分散式分割槽檢視就是資料來源存在於不同的資料庫或不同的資料庫伺服器使用 UNION ALL 建立的檢視。
1 --判斷使用者自定義檢視是否存在 2 if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou_Par') and objectproperty(id,N'IsView')=1) 3 drop view v_Stu_Cou_Par --刪除檢視 4 go 5 create view dbo.v_Stu_Cou_Par --建立檢視 6 as 7 select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name 8 from Student s1 9 left join Course c on s1.C_S_Id=c.C_Id 10 where s1.C_S_Id is not null 11 12 union all 13 14 select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name 15 from Student_back s2 16 left join Course c on s2.C_S_Id=c.C_Id 17 where s2.C_S_Id is not null 18 go 19 20 select * from v_Stu_Cou_Par --使用檢視查詢
當底層表的資料發生改變是,使用 sql 系統儲存過程 sp_refreshview 更新檢視資料。
1 exec sp_refreshview 'v_Stu_Cou_Par' -- v_Stu_Cou_Par 檢視名稱
使用 sql 系統儲存過程 sp_helptext 獲取自定義檢視建立的 T-SQL 文字。
1 exec sp_helptext 'v_Stu_Cou_Par' -- v_Stu_Cou_Par 檢視名稱
PS:檢視不能包含 ORDER BY 子句,除非SELECT語句的選擇列表中還有一個 TOP 子句。
檢視不能使用 INTO 關鍵字。檢視不能包含 OPTION 子句。
檢視不能有對臨時表或表變數的引用。檢視最多可以有 1024 列。