SQL Server視圖

想來想去,總想寫寫SQL Server方面的知識,像視圖、存儲過程,大數據量操做的優化等等。html

先把基礎的知識總結個遍先,而後再尋求更高更遠的發展。這篇文章,將帶你們來看看視圖。數據庫

何謂視圖,視圖包含行和列,就像一個真實的表(虛表)。視圖中的字段就是來自一個或多個數據庫中真實的表中的字段。咱們能夠向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,咱們也能夠提交數據,就像這些來自於某個單一的表。安全

對於視圖跟函數的區別,不少人都想知道,我也想知道,也上網查詢了相關的內容,可是大多隻是解釋其概念,並無區分明白。那麼,就我學習到的內容,我也談談它們之間的區別。我認爲視圖跟內聯表值函數比較接近(只是接近,可是不能取代)。不一樣於標量函數只能返回一個值,不一樣於多語句表值函數,能夠有多條語句來返回表數據集。對於內聯表值函數來說,視圖沒有參數傳遞的方式。而對於視圖來說,它比內聯表值函數多出一個WITH CHECK OPTION限制。WITH CHECK OPTION限制可看下文介紹。若是以爲本人總結得很差,歡迎你們拍磚。讓思惟碰撞出火花,讓咱們共同進步。函數

 

建立視圖

 

CREATE VIEW <視圖名> [(<列名>[,<列名>]....)]
AS
<子查詢>
[WITH CHECK OPTION]

其中的[]爲可選項,便可用可不用。WITH CHECK OPTION表示對視圖進行UPDATE、INSERT和DELETE操做時要保證更新、插入和刪除的行知足視圖定義中的謂詞條件(即子查詢中的條件表達式)。學習

建立視圖可經過下圖右鍵的方式來建立,也能夠在新建查詢窗口裏面寫建立視圖的語句。大數據

CREATE VIEW [dbo].[VPerson](FName, FCity, FAge, FSalary)
AS
SELECT FName, FCity, FAge, FSalary
FROM dbo.T_Person
WHERE FAge=20
WITH CHECK OPTION

上面說了使用WITH CHECK OPTION表示對視圖進行UPDATE、INSERT和DELETE操做時要保證更新、插入和刪除的行知足視圖定義中的謂詞條件(即子查詢中的條件表達式),若是不知足的話,會怎麼樣?咱們來看看下面的例子:優化

UPDATE [dbo].[VPerson] SET FAGE=10 WHERE FAGE=20

報錯以下:spa

試圖進行的插入或更新已失敗,緣由是目標視圖或者目標視圖所跨越的某一視圖指定了 WITH CHECK OPTION,而該操做的一個或多個結果行又不符合 CHECK OPTION 約束。
語句已終止。

使用WITH CHECK OPTION能夠這麼解釋:經過視圖進行的操做,必須也能經過該視圖看到操做後的結果。code

好比INSERT,那麼加的這條記錄在視圖查詢後必須能夠看到。htm

好比UPDATE,修改完的結果也必須能經過該視圖看到。

好比DELETE,只能刪除視圖裏有顯示的記錄。

  INSERT INTO [dbo].[VPerson]([FName],[FCity],[FAge],[FSalary])
  VALUES('Peter','SZ', 20,2000)

 上面INSERT的例子若是FAge不是20的話,則跟上面UPDATE的報錯同樣。

 INSERT INTO [dbo].[VPerson]([FName],[FCity],[FSalary])
  VALUES('Peter','SZ',2000)

 由於視圖[VPerson]使用了下面的語句,則對視圖使用插入語句時,系統默認已經給FAage指定好了20這個條件值

WHERE FAge=20
WITH CHECK OPTION

 

 刪除視圖

 

  DROP VIEW <視圖> [CASCADE];

其中的[]爲可選項,便可用可不用。視圖刪除後視圖的定義將從數據字典中刪除。若是該視圖上還導出了其餘視圖,則使用CASCADE級聯刪除語句,把該視圖和由它導出的全部視圖一塊兒刪除。

基本表刪除後,由該基本表導出的全部視圖(定義)沒有被刪除,但均已沒法使用了。若是須要刪除視圖,則可使用上面的DROP VIEW語句來刪除。

  DROP VIEW [VPerson];

 注:很奇怪,我使用了下面級聯的刪除語句,發現總是報錯。查看了網上的一些資料,有人說沒有級聯的刪除方式。不知道大夥知道不?

  DROP VIEW [VPerson] CASCADE;
關鍵字 'CASCADE' 附近有語法錯誤。

 

 視圖做用

 

視圖的做用,我轉載博友(http://www.cnblogs.com/sunzhiyue/archive/2011/12/12/2284853.html )的內容。

第一點:使用視圖,能夠定製用戶數據,聚焦特定的數據

解釋:在實際過程當中,公司有不一樣角色的工做人員。咱們以銷售公司爲例的話,採購人員,可能須要一些與其有關的數據,而與他無關的數據,對他沒有任何意義,咱們能夠根據這一實際狀況,專門爲採購人員建立一個視圖,之後他在查詢數據時,只需select * from view_caigou 就能夠啦。 (固然拉,不會是叫人去裝數據庫客戶端吧) 

第二點:使用視圖,能夠簡化數據操做

解釋:咱們在使用查詢時,在不少時候咱們要使用聚合函數,同時還要顯示其它字段的信息,可能還會須要關聯到其它表,這時寫的語句可能會很長,若是這個動做頻繁發生的話,咱們能夠建立視圖,這樣之後,咱們只須要select * from view1就能夠啦~,是否是很方便呀~  

第三點:使用視圖,基礎表中的數據就有了必定的安全性

解釋:由於視圖是虛擬的,物理上是不存在的,只是存儲了數據的集合,咱們能夠將基礎表中重要的字段信息,能夠不經過視圖給用戶,視圖是動態的數據的集合,數據是隨着基面表的更新而更新。同時,用戶對視圖,不能夠隨意的更改和刪除,能夠保證數據的安全性。  

第四點:能夠合併分離的數據,建立分區視圖

解釋:隨着社會的發展,公司的業務量不斷的擴大,一個大公司,下屬都設有不少的分公司,爲了管理方便,咱們須要統一表的結構,按期查看各公司業務狀況,而分別看各個公司的數據很不方便,沒有很好的可比性,若是將這些數據合併爲一個表格裏,就方便多啦,這時咱們就可使用union關鍵字,將各分公司的數據合併爲一個視圖。

至此本文完。 

相關文章
相關標籤/搜索