1.視圖的概述
視圖其實就是一條查詢sql語句,用於顯示一個或多個表或其他視圖中的相關資料。視圖將一個查詢的結果作為一個表來使用,因此視圖可以被看作是儲存的查詢或一個虛擬表。視圖來源於表,所有對視圖資料的修改最終都會被反映到視圖的基表中,這些修改必須服從基表的完整性條件約束,並同樣會觸發定義在基表上的觸發器。(Oracle支援在視圖上顯式的定義觸發器和定義一些邏輯約束)
2.視圖的儲存
與表不同,視圖不會要求分配儲存空間,視圖中也不會包含實際的資料。視圖只是定義了一個查詢,視圖中的資料是從基表中擷取,這些資料在視圖被引用時動態產生。由於視圖基於資料庫中的其他對象,因此一個視圖只需要佔用資料字典中儲存其定義的空間,而無需額外的儲存空間。
3.視圖的作用
使用者可以通過視圖以不同形式來顯示基表中的資料,視圖的強大之處在於它能夠根據不同使用者的需要來對基表中的資料進行整理。視圖常見的用途如下:
通過視圖可以設定允許使用者訪問的列和資料行,從而為表提供了額外的安全控制
隱藏資料複雜性
視圖中可以使用串連(join),用多個表中相關的列構成一個新的資料集。此視圖就對使用者隱藏了資料來源於多個表的事實。
簡化使用者的SQL 陳述式
使用者使用視圖就可從多個表中查詢資訊,而無需瞭解這些表是如何串連的。
以不同的角度來顯示基表中的資料
視圖的列名可以被任意改變,而不會影響此視圖的基表
使應用程式不會受基表定義改變的影響
在一個視圖的定義中查詢了一個包含4 個資料列的基表中的3 列。當基表中添加了新的列後,由於視圖的定義並沒有被影響,因此使用此視圖的應用程式也不會被影響。
儲存複雜查詢
一個查詢可能會對錶資料進行複雜的計算。使用者將這個查詢儲存為視圖之後,每次進行類似計算只需查詢此視圖即可。
邏輯資料獨立性
視圖可以使應用程式和資料庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之後,程式可以建立在視圖之上,從而程式與資料庫表被視圖分割開來。
4.視圖的工作機制
視圖的定義就是其使用的查詢語句,Oracle 將這個定義以文本形式儲存在資料字典中。當使用者在 SQL 陳述式中引用了視圖時,Oracle 將進行以下工作:
將引用了視圖的語句與視圖的定義語句整合為一個語句
在共用SQL 區解析整合後的語句
執行此語句
當現有的共用SQL 區中沒有與整合後的語句一致時,Oracle 才會為此語句建立新的共用SQL 區。因此,引用了視圖的SQL 陳述式也能夠利用已有的共用 SQL 區以達到節約記憶體和提高效能的目的。
5.視圖的依賴性
由於視圖的定義是一個引用了其他對象(表,視圖)的查詢,因此視圖依賴於其所引用的對象。Oracle 會自動地處理視圖的依賴性。例如,當使用者移除了一個視圖的基表後再重建此表,Oracle 將檢查新的基表是否符合視圖的定義並判斷視圖的有效性。
6.可更新的串連視圖
串連視圖是指在一個視圖的定義查詢的from字句中引用了多個表或視圖。而可更新的串連視圖是指能夠執行 UPDATE,INSERT,和 DELETE 操作的串連視圖。為了保證視圖是可更新的,其定義中不能包含以下文法結構:
集合操作符
DISTINCT 操作符
彙總函式或分析型函數
GROUP BY,ORDER BY,CONNECT BY,或 START WITH 字句
在 SELECT 之後的列表中使用集合運算式
在 SELECT 之後的列表中使用子查詢
串連(join)(但是有例外情況)
對於不可更新的視圖,可以利用 INSTEAD OF 觸發器對其資料進行修改。