【數據庫】oracle數據庫----內嵌視圖

關係視圖是數據庫對象,創建關係視圖實際是對查詢定義可重用的需求。但有時,查詢定義並不會被重用。此時,創建關係視圖便不再適宜------過多的關係視圖勢必增加數據庫的維護成本。oracle提供了內嵌視圖來解決這一問題。

1、內嵌視圖簡介

如同關係視圖,內嵌視圖也是查詢定義。內嵌的意義在於,視圖定義嵌入在複雜查詢語句中,其角色與普通數據表或關係視圖相同。內嵌視圖不必使用create view 命令進行創建,因此,在數據字典中也無法獲得相應信息。內嵌視圖是子查詢的一種,可以與數據表、視圖一樣作爲查詢語句的數據源存在,但在形式上有較大的區別。


數據表和關係視圖作爲數據源,只需要出現對象名稱即可,而內嵌視圖則是以SQL查詢語句的形式存在。


2、使用內嵌視圖

內嵌視圖可以應用於查詢語句、更新語句及插入語句中。其中,最常用的場景爲複雜查詢中的子查詢或作爲中間結果集。


例子:在表employees中存儲了員工的信息,現需獲取年齡最小的兩名員工的信息,爲了保證最終結果的正確性,首先進行人工分析。

SQL>select * from employees;

分析所有員工情況可知,employee_id爲4和5的員工爲我們的搜尋目標。

按照習慣思維,首先應當將所有記錄按照employee_age進行升序排列,然後獲取前兩位員工的信息。oracle數據表的僞劣rownum可以返回每行記錄所對應的行號,利用rownum<3的條件可以返回前兩行記錄。嘗試使用如下SQL語句進行搜尋。

SQL>select * from employees where rownum<3 order by employee_age;

其中,order by employee_age用於對錶employees中的記錄按照employee_age值由小到大進行排序;where rownum<3則是搜索條件-----搜尋到的結果集的行號小於3.

但是,分析查詢結果可知,該搜尋結果與預期結果並不符合,這是因爲,rownum對結果集中的各記錄賦以行號的時候,並未進行排序。也就是說,rownum的賦值操作處於order by employee_age操作之後,因此,利用此語句並不能獲得預期的效果。

內嵌式圖正式解決這個問題的最佳策略。利用內嵌視圖,可以首先獲得排序之後的結果集,然後將該結果集作爲數據源進行查詢時,rownum自然按照此時的順序賦值。這樣就可以在排序之後進行rownum的賦值動作。相應的SQL語句如下所示:

SQL>select * from ( select * from employees order by employee_age ) where rownum < 3 ;

其中,( select * from employees order by employee_age )即爲內嵌視圖,該內嵌視圖實際提供了一個數據源。該數據源時將表employees中的記錄按employee_age列進行升序排列之後得到的。where rownum <3 則是自封裝之後的數據源,獲取前兩行數據,從而得到年齡最小的兩位員工。

例子:內嵌視圖往往與其他數據源(數據表、關係視圖等)一起使用。此時便需要內嵌視圖指定別名,以便引用,並與其他數據源中的列進行區分。

上面的列子中,使用了內嵌視圖獲得了年齡最小的兩位員工的記錄。同時,還想獲得兩位員工的工資情況,那麼可以使用內嵌視圖與表salary進行連接。此時,在內嵌式圖與表salary中會存在重複列,因此,需要爲內嵌視圖指定別名。

SQL> select * t.employee_id, t.employee_name, t.employee_age, s.salary from 

( select * from (  select * from employees order by employee_age) where rownum <3 ) t, salary s 

where t.employee_id = s.employee_id;


3、內嵌視圖小結

內嵌視圖的特點在於無須創建真正的數據庫對象,而只是封裝查詢,因此會節約數據資源,同時不會增加維護成本。但是內嵌視圖不具有可複用性,因此當預期將在多處調用到同一查詢定義時,還是應該使用關係視圖。

內嵌視圖之所以成爲內嵌,是因爲她總是出現在較複雜的查詢中,而其外層查詢問往往被稱爲父查詢,因此,內嵌視圖也可以看做子查詢。

內嵌視圖在處理大數據量查詢時,不具有優勢。相對來說,使用臨時表反而是更好的選擇。臨時表作爲實實在在存在的數據庫對象,可以通過創建索引等手段來更好的提高性能,這正是視圖所不具備的。

總之,內嵌視圖的優點是:節省數據庫資源,不增加維護成本;而缺點是,不可複用,以及大數據量的查詢效率低下等。








發佈了53 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章