想來想去,總想寫寫SQL Server方面的知識,像視圖、存儲過程,大數據量操作的優化等等。
先把基礎的知識總結個遍先,然后再尋求更高更遠的發展。這篇文章,將帶大家來看看視圖。
何謂視圖,視圖包含行和列,就像一個真實的表(虛表)。視圖中的字段就是來自一個或多個數據庫中真實的表中的字段。我們可以向視圖添加 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
報錯如下:
試圖進行的插入或更新已失敗,原因是目標視圖或者目標視圖所跨越的某一視圖指定了 WITH CHECK OPTION,而該操作的一個或多個結果行又不符合 CHECK OPTION 約束。 語句已終止。
使用WITH CHECK OPTION可以這么解釋:通過視圖進行的操作,必須也能通過該視圖看到操作后的結果。
比如INSERT,那么加的這條記錄在視圖查詢后必須可以看到。
比如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關鍵字,將各分公司的數據合並為一個視圖。
至此本文完。