【数据库】oracle数据库----内嵌视图
關(guān)系視圖是數(shù)據(jù)庫對象,創(chuàng)建關(guān)系視圖實際是對查詢定義可重用的需求。但有時,查詢定義并不會被重用。此時,創(chuàng)建關(guān)系視圖便不再適宜------過多的關(guān)系視圖勢必增加數(shù)據(jù)庫的維護成本。oracle提供了內(nèi)嵌視圖來解決這一問題。
1、內(nèi)嵌視圖簡介
如同關(guān)系視圖,內(nèi)嵌視圖也是查詢定義。內(nèi)嵌的意義在于,視圖定義嵌入在復(fù)雜查詢語句中,其角色與普通數(shù)據(jù)表或關(guān)系視圖相同。內(nèi)嵌視圖不必使用create view 命令進行創(chuàng)建,因此,在數(shù)據(jù)字典中也無法獲得相應(yīng)信息。內(nèi)嵌視圖是子查詢的一種,可以與數(shù)據(jù)表、視圖一樣作為查詢語句的數(shù)據(jù)源存在,但在形式上有較大的區(qū)別。
數(shù)據(jù)表和關(guān)系視圖作為數(shù)據(jù)源,只需要出現(xiàn)對象名稱即可,而內(nèi)嵌視圖則是以SQL查詢語句的形式存在。
2、使用內(nèi)嵌視圖
內(nèi)嵌視圖可以應(yīng)用于查詢語句、更新語句及插入語句中。其中,最常用的場景為復(fù)雜查詢中的子查詢或作為中間結(jié)果集。
例子:在表employees中存儲了員工的信息,現(xiàn)需獲取年齡最小的兩名員工的信息,為了保證最終結(jié)果的正確性,首先進行人工分析。
SQL>select * from employees;
分析所有員工情況可知,employee_id為4和5的員工為我們的搜尋目標。
按照習(xí)慣思維,首先應(yīng)當將所有記錄按照employee_age進行升序排列,然后獲取前兩位員工的信息。oracle數(shù)據(jù)表的偽劣rownum可以返回每行記錄所對應(yīng)的行號,利用rownum<3的條件可以返回前兩行記錄。嘗試使用如下SQL語句進行搜尋。
SQL>select * from employees where rownum<3 order by employee_age;
其中,order by employee_age用于對表employees中的記錄按照employee_age值由小到大進行排序;where rownum<3則是搜索條件-----搜尋到的結(jié)果集的行號小于3.
但是,分析查詢結(jié)果可知,該搜尋結(jié)果與預(yù)期結(jié)果并不符合,這是因為,rownum對結(jié)果集中的各記錄賦以行號的時候,并未進行排序。也就是說,rownum的賦值操作處于order by employee_age操作之后,因此,利用此語句并不能獲得預(yù)期的效果。
內(nèi)嵌式圖正式解決這個問題的最佳策略。利用內(nèi)嵌視圖,可以首先獲得排序之后的結(jié)果集,然后將該結(jié)果集作為數(shù)據(jù)源進行查詢時,rownum自然按照此時的順序賦值。這樣就可以在排序之后進行rownum的賦值動作。相應(yīng)的SQL語句如下所示:
SQL>select * from ( select * from employees order by employee_age ) where rownum < 3 ;
其中,( select * from employees order by employee_age )即為內(nèi)嵌視圖,該內(nèi)嵌視圖實際提供了一個數(shù)據(jù)源。該數(shù)據(jù)源時將表employees中的記錄按employee_age列進行升序排列之后得到的。where rownum <3 則是自封裝之后的數(shù)據(jù)源,獲取前兩行數(shù)據(jù),從而得到年齡最小的兩位員工。
例子:內(nèi)嵌視圖往往與其他數(shù)據(jù)源(數(shù)據(jù)表、關(guān)系視圖等)一起使用。此時便需要內(nèi)嵌視圖指定別名,以便引用,并與其他數(shù)據(jù)源中的列進行區(qū)分。
上面的列子中,使用了內(nèi)嵌視圖獲得了年齡最小的兩位員工的記錄。同時,還想獲得兩位員工的工資情況,那么可以使用內(nèi)嵌視圖與表salary進行連接。此時,在內(nèi)嵌式圖與表salary中會存在重復(fù)列,因此,需要為內(nèi)嵌視圖指定別名。
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、內(nèi)嵌視圖小結(jié)
內(nèi)嵌視圖的特點在于無須創(chuàng)建真正的數(shù)據(jù)庫對象,而只是封裝查詢,因此會節(jié)約數(shù)據(jù)資源,同時不會增加維護成本。但是內(nèi)嵌視圖不具有可復(fù)用性,因此當預(yù)期將在多處調(diào)用到同一查詢定義時,還是應(yīng)該使用關(guān)系視圖。
內(nèi)嵌視圖之所以成為內(nèi)嵌,是因為她總是出現(xiàn)在較復(fù)雜的查詢中,而其外層查詢問往往被稱為父查詢,因此,內(nèi)嵌視圖也可以看做子查詢。
內(nèi)嵌視圖在處理大數(shù)據(jù)量查詢時,不具有優(yōu)勢。相對來說,使用臨時表反而是更好的選擇。臨時表作為實實在在存在的數(shù)據(jù)庫對象,可以通過創(chuàng)建索引等手段來更好的提高性能,這正是視圖所不具備的。
總之,內(nèi)嵌視圖的優(yōu)點是:節(jié)省數(shù)據(jù)庫資源,不增加維護成本;而缺點是,不可復(fù)用,以及大數(shù)據(jù)量的查詢效率低下等。
轉(zhuǎn)載于:https://www.cnblogs.com/iamliuxin/p/5617794.html
總結(jié)
以上是生活随笔為你收集整理的【数据库】oracle数据库----内嵌视图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx配置文件【转载】
- 下一篇: VMware10.0.4下 CentOS