- SQL Server 2016 從入門到實戰(視頻教學版)
- 孫亞男
- 2229字
- 2019-12-12 17:28:46
5.1 視圖概述
視圖是一個虛擬表,其內容由查詢定義。對其中所引用的基礎表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當前或其他數據庫的一個或多個表,或者其他視圖。分布式查詢也可用于定義使用多個異類源數據的視圖。例如,如果有多臺不同的服務器分別存儲不同地區的數據,而我們需要將這些服務器上結構相似的數據組合起來,這種方式就很有用。
視圖的結構和內容是通過SQL查詢獲得的,也稱之為視圖名,可以永久地保存在數據庫中。用戶通過SQL查詢語句,可以像其他普通關系表一樣,對視圖中的數據進行查詢。視圖可以被看成是虛擬表或存儲查詢,可通過視圖訪問的數據不作為獨特的對象存儲在數據庫內。
視圖在數據庫內存儲的是SELECT語句,即數據庫內并沒有存儲視圖這個表,而存儲的是視圖的定義。SELECT語句的結果集構成視圖所返回的虛擬表。用戶可以用引用表時所使用的方法在SQL語句中通過引用視圖名稱來使用虛擬表。使用視圖可以實現下列任一或所有功能:
(1)將用戶限定在表中的特定行上。例如,只允許雇員看見工作跟蹤表內記錄其工作的行。
(2)將用戶限定在特定列上。例如,對于那些不負責處理工資單的雇員,只允許其看見雇員表中的姓名列、辦公室列、工作電話列和部門列,而不能看見任何包含工資信息或個人信息的列。
(3)將多個表中的列連接起來,使它們看起來像一個表。
(4)聚合信息而非提供詳細信息。例如,顯示一個列的和,或列的最大值和最小值。
當數據庫管理系統DBMS在SQL語句中遇到視圖引用時,會從數據庫中找出所存儲的相應視圖的定義,然后把對視圖的引用轉換成對構成視圖源表的等價請求,并且執行這個等價請求。利用這種方法,DBMS在保持源表數據完整性的同時也保持了視圖的“可見性”。
對于簡單視圖,DBMS通過快速查詢直接從源表中提取并構造出視圖的每一行。而對于一些比較復雜的視圖,DBMS則要根據該視圖定義中的查詢語句進行查詢操作,并將結果存儲到一個臨時表中。然后DBMS再從這個臨時表中提取數據以滿足對視圖操作的需要,并在不需要的時候拋棄所生成的臨時表。但不論DBMS如何操作,對用戶來講,其結果都是相同的,即這個視圖能夠在SQL語句中引用,就好像其是一張真正的關系表一樣。
通過定義SELECT語句以檢索將在視圖中顯示的數據來創建視圖。SELECT語句引用的數據表稱為視圖的基表。視圖通常用來集中、簡化和自定義每個用戶對數據庫的不同認識。視圖可用作安全機制,方法是允許用戶通過視圖訪問數據,而不授予用戶直接訪問視圖基礎表的權限。視圖可用于提供向后兼容接口來模擬曾經存在但其架構已更改的表。還可以在向SQL Server復制數據和從其中復制數據時使用視圖,以便提高性能并對數據進行分區。
5.1.1 視圖的類型
除了基本用戶定義視圖的標準角色以外,SQL Server 2016還提供了下列類型的視圖,這些視圖在數據庫中起著特殊的作用。
(1)索引視圖
索引視圖是被具體化了的視圖。這意味著已經對視圖定義進行了計算并且生成的數據像表一樣存儲,用戶可以為視圖創建索引,即對視圖創建一個唯一的聚集索引。索引視圖可以顯著提高某些類型查詢的性能,尤其適于聚合許多行的查詢,但不太適于經常更新的基本數據集。
(2)分區視圖
分區視圖在一臺或多臺服務器間水平連接一組成員表中的分區數據,使數據看上去如同來自于一個表。需要注意的是,連接同一個SQL Server 2016實例中成員表的視圖就是一個本地分區視圖。
(3)系統視圖
系統視圖包含目錄元數據,可以使用系統視圖返回與SQL Server實例或在該實例中定義的對象有關的信息。例如,可以查詢sys.databases目錄視圖以便返回實例中提供的用戶定義數據庫有關的信息。
5.1.2 視圖的優缺點
在數據庫中使用視圖有很多優點,尤其是在定義用戶使用的數據庫結構和增強數據庫的安全保密性方面,視圖起了準則作用。使用視圖的主要優點是:
(1)安全保密性。通過視圖,用戶只能查詢和修改他們所能見到的數據,數據庫中的其他數據則既看不見也取不到。數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定行和特定的列上。通過視圖,用戶可以被限制在數據的不同子集上。
(2)查詢簡單性。視圖能夠從幾個不同的關系表中提取數據,并且用一個單表表示出來,利用視圖將多表查詢轉換成視圖的單表查詢。
(3)結構簡單性。視圖能夠給用戶一個“個人化”的數據庫結構外觀,用一組用戶感興趣的可見表來代表這個數據庫的內容。
(4)隔離變化。視圖能夠代表一個個一致的、非變化的數據。即使是在作為視圖基礎的源表被分隔、重新構造或者重新命名的情況下,也是如此。
(5)數據完整性。如果數據被存取,并通過視圖來輸入,DBMS就能夠自動地校驗這個數據,以便確保數據滿足所規定的完整性約束。
(6)邏輯數據獨立性。視圖可以使應用程序和數據庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之后,程序可以建立在視圖之上,從而使程序與數據庫表被視圖分隔開來。
雖然視圖存在上述的優點,但是在定義數據庫對象時不能不加選擇地來定義視圖,因為視圖也存在一些缺點,主要如下:
(1)性能。數據庫管理系統必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個復雜的多表查詢所定義的,那么即使是對視圖的一個簡單查詢,數據庫管理系統也會將其變成一個復雜的結合體,需要花費一定的時間。
(2)修改限制。當用戶試圖修改視圖的某些記錄行時,數據庫管理系統必須將其轉化為對基本表的某些行的修改。對于簡單視圖來說,這是很方便的,但是對于比較復雜的視圖,可能是不可修改的。
在實際應用中,應該根據實際情況權衡視圖的優點和缺點,合理地定義視圖。
- PHP動態網站程序設計
- JavaScript從入門到精通(微視頻精編版)
- Android項目開發入門教程
- GeoServer Cookbook
- LabVIEW2018中文版 虛擬儀器程序設計自學手冊
- 深入理解Django:框架內幕與實現原理
- C/C++算法從菜鳥到達人
- 薛定宇教授大講堂(卷Ⅳ):MATLAB最優化計算
- Amazon S3 Cookbook
- Reactive Programming With Java 9
- Learning Data Mining with R
- 碼上行動:用ChatGPT學會Python編程
- Learning JavaScript Data Structures and Algorithms
- Mastering Android Development with Kotlin
- Python之光:Python編程入門與實戰