視圖是一個虛擬表,其內容由查詢定義。 同表同樣,視圖包含一系列帶有名稱的列和行數據。 視圖在數據庫中並非以數據值存儲集形式存在,除非是索引視圖。 行和列數據來自由定義視圖的查詢所引用的表,而且在引用視圖時動態生成。sql
對其中所引用的基礎表來講,視圖的做用相似於篩選。 定義視圖的篩選能夠來自當前或其餘數據庫的一個或多個表,或者其餘視圖。 分佈式查詢也可用於定義使用多個異類源數據的視圖。 例如,若是有多臺不一樣的服務器分別存儲您的單位在不一樣地區的數據,而您須要將這些服務器上結構類似的數據組合起來,這種方式就頗有用。數據庫
視圖一般用來集中、簡化和自定義每一個用戶對數據庫的不一樣認識。 視圖可用做安全機制,方法是容許用戶經過視圖訪問數據,而不授予用戶直接訪問視圖基礎表的權限。 視圖可用於提供向後兼容接口來模擬曾經存在但其架構已更改的表。 還能夠在向 SQL Server 複製數據和從其中複製數據時使用視圖,以便提升性能並對數據進行分區。express
除了基本用戶定義視圖的標準角色之外, SQL Server 還提供了下列類型的視圖,這些視圖在數據庫中起着特殊的做用:安全
索引視圖
索引視圖是被具體化了的視圖。 這意味着已經對視圖定義進行了計算而且生成的數據像表同樣存儲。 能夠爲視圖建立索引,即對視圖建立一個惟一的彙集索引。 索引視圖能夠顯著提升某些類型查詢的性能。 索引視圖尤爲適於聚合許多行的查詢。 但它們不太適於常常更新的基本數據集。服務器
分區視圖
分區視圖在一臺或多臺服務器間水平鏈接一組成員表中的分區數據。 這樣,數據看上去如同來自於一個表。 聯接同一個 SQL Server 實例中的成員表的視圖是一個本地分區視圖。架構
系統視圖
系統視圖公開目錄元數據。 您可使用系統視圖返回與 SQL Server 實例或在該實例中定義的對象有關的信息。 例如,你能夠查詢 sys.databases 目錄視圖以便返回與實例中提供的用戶定義數據庫有關的信息。 有關詳細信息,請參閱系統視圖 (Transact-SQL)。分佈式
能夠將視圖用於如下用途:函數
集中、簡化和自定義每一個用戶對數據庫的認識。性能
用做安全機制,方法是容許用戶經過視圖訪問數據,而不授予用戶直接訪問底層基表的權限。加密
提供向後兼容接口來模擬架構已更改的表。
爲最終用戶減小數據庫呈現的複雜性,客戶端只要對視圖寫簡單的代碼,就能返回所須要的數據,一些複雜的邏輯操做,放在了視圖中來完成。
對視圖添加一些額外的索引,來提升查詢的效率。
能夠合併分離的數據,建立分區視圖。
只能在當前數據庫中建立視圖。 CREATE VIEW 必須是查詢批處理中的第一條語句。 視圖最多能夠包含 1024 列。
建立視圖時,有關該視圖的信息將存儲在下列目錄視圖中:sys.views、sys.columns 和 sys.sql_expression_dependencies。CREATE VIEW 語句的文本將存儲在 sys.sql_modules 目錄視圖中。
建立視圖時, 數據庫引擎將保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的設置。 使用視圖時,將使用這些原始設置來分析視圖。 所以,訪問視圖時,SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的任何客戶端會話設置都不會影響視圖定義。
視圖定義中的 SELECT 子句不能包括下列內容:
ORDER BY 子句,除非在 SELECT 語句的選擇列表中也有一個 TOP 子句。ORDER BY 子句僅用於肯定視圖定義中的 TOP 或 OFFSET 子句返回的行。 ORDER BY 不保證在查詢視圖時獲得有序結果,除非在查詢自己中也指定了 ORDER BY。
INTO 關鍵字。
OPTION 子句。
引用臨時表或表變量:
由於 select_statement 使用 SELECT 語句,因此按照 FROM 子句的指定,使用 <join_hint> 和 <table_hint> 提示是有效的。有關詳細信息,請參閱 FROM (Transact-SQL) 和 SELECT (Transact-SQL)。
UNION 或 UNION ALL 分隔的函數和多個 SELECT 語句可在 select_statement 中使用。
CHECK OPTION
要求對該視圖執行的全部數據修改語句都必須符合 select_statement 中所設置的條件。 經過視圖修改行時,WITH CHECK OPTION 可確保提交修改後,仍可經過視圖看到數據。
只要知足下列條件,便可經過視圖修改基礎基表的數據:
任何修改(包括 UPDATE、INSERT 和 DELETE 語句)都只能引用一個基表的列。
視圖中被修改的列必須直接引用表列中的基礎數據。 不能經過任何其餘方式對這些列進行派生,如經過如下方式:
聚合函數:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。
計算。 不能從使用其餘列的表達式中計算該列。 使用集合運算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 造成的列將計入計算結果,且不可更新。
被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影響。
TOP 在視圖的 select_statement 中的任何位置都不會與 WITH CHECK OPTION 子句一塊兒使用。
上述限制應用於視圖的 FROM 子句中的任何子查詢,就像其應用於視圖自己同樣。 一般狀況下, 數據庫引擎必須可以明確跟蹤從視圖定義到一個基表的修改。 有關詳細信息,請參閱經過視圖修改數據。
若是上述限制妨礙直接經過視圖修改數據,則能夠考慮如下選項:
INSTEAD OF 觸發器
能夠對視圖建立 INSTEAD OF 觸發器,以使視圖可更新。 將執行 INSTEAD OF 觸發器,而不是執行對其定義了觸發器的數據修改語句。 此觸發器容許用戶指定必須發生以處理數據修改語句的操做集合。 所以,若是存在給定的數據修改語句(INSERT、UPDATE 或 DELETE)的視圖的 INSTEAD OF 觸發器,則可經過該語句更新相應的視圖。 有關 INSTEAD OF 觸發器的詳細信息,請參閱 DML 觸發器。
分區視圖
若是視圖爲分區視圖,則可遵循某些限制對其進行更新。 必要時, 數據庫引擎將本地分區視圖辨別爲全部參與表和視圖都在同一 SQL Server 實例上的視圖,而將分佈式分區視圖辨別爲視圖中至少有一個表駐留在其餘或遠程服務器上的視圖。
優勢:
一、向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,也能夠提交數據,就像這些來自於某個單一的表。
二、數據安全。
三、能夠給視圖加密。
四、視圖還能夠被嵌套,一個視圖中能夠嵌套另外一個視圖。
缺點:
一、性能:SQL Server必須把視圖的查詢轉化成對基本表的查詢,若是這個視圖是由一個複雜的多表查詢所定義,那麼,即便是視圖的一個簡單查詢,SQL Server也把它變成一個複雜的結合體,須要花費必定的時間。
二、修改限制:當用戶試圖修改視圖的某些行時,SQL Server必須把它轉化爲對基本表的某些行的修改。對於簡單視圖來講,這是很方便的,可是,對於比較複雜的視圖,多是不可修改的。
三、數據庫表結構的修改可能須要修改相應的視圖,維護和遷移麻煩。