日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】ORACLE中的子查询 ---OCP--047--46

發布時間:2023/11/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】ORACLE中的子查询 ---OCP--047--46 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

“子查詢”就是查詢中嵌套著另一個查詢,也即通過SELECT語句的嵌套使用形成子查詢。當我們不知道特定的查詢條件時,可以用子查詢來為父查詢提供查詢條件以獲得查詢結果。
ORACLE中常見的子查詢有下面幾類:
A、單行子查詢(Single-row subqueries)。
B、多行子查詢(Multirow subqueries)。
C、內部視圖型子查詢(Inline views)。
D、多列子查詢(Multiple-column subqueries)。
在我們繼續詳細討論子查詢之前,先看看寫子查詢的一些特別要注意的地方:
A、子查詢必須放在括號內。
B、子查詢也必須放在比較操作符號的右邊。
C、子查詢最多可以嵌套到255級。
子查詢中不能使用ORDER BY子句,即ORDER BY必須位于查詢的最外層。?
一、單行子查詢(Single-Row Subqueries)
單行子查詢并不是最后輸出的結果只能返回一行,而是指子查詢只能返回一行。
有一條規則我們必須記住:
當我們用“等于”比較操作符把子查詢和父查詢嵌套在一起時,父查詢期望從子查詢那里只得到一行返回值。
例一:

SELECT ename,deptno,sal FROM EMP WHERE deptno=(SELECT deptno FROM dept WHERE loc=’New York’);

?

在這個例子中,如果子查詢“SELECT deptno FROM dept WHERE loc=’New York’”只返回一行,則這個例子能正確運行,否則將出錯。原因見前面規則。
其它一些表明是單行子查詢的比較操作符有“>,>=,<,<=,<>”。
??
二、多行子查詢(Multirow Subqueries)
多行子查詢,意味著子查詢返回的結果子集可以是多行。因此,我們通常用集合比較操作符(如:IN, NOT IN)把父查詢和子查詢連接起來。???
例二:

SELECT ename,job,sal FROM EMP WHERE deptno in ( SELECT deptno FROM dept WHERE dname LIKE ‘A%’);

?

三、多列子查詢(Multiple-Column Subqueries):
前面兩個例子中,主查詢的WHERE子句中都只有一列。然而,有時需要主查詢處理多列。例如,為了得到每個部門工資最高的員工信息,可以使用下面的例子。??
例三:

SELECT deptno,ename,job,sal FROM EMP WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMPGROUP BY deptno);

?

? ? ?在使用多列子查詢時必須注意:
A、 主查詢中,必須把WHERE子句中需要的多個列用括號括起來,否則發生錯誤。
B、 主查詢WHERE子句中的列與子查詢中返回的列必須匹配。

四、內聯視圖子查詢(inline view Subqueries):
通常的查詢中,FROM子句后面都是具體的表名。然而,我們也可以在FROM后面跟上一個子查詢作為中間
數據結果集,這個中間結果集就是內聯視圖(inline view)。帶有內聯視圖的子查詢就是內聯視圖子查
詢。
例四:
??? SELECT ename,job,sal,rownum?
?FROM (SELECT ename,job,sal FROM EMP ORDER BY sal);
從這個例子我們應該注意到:
FROM子句后面的內聯視圖是可以使用ORDER BY子句進行排序的。然而,其它視圖或子查詢是不能用ORDER?
BY進行排序的。
另外,我們在內聯視圖可以排序的基礎上,可以使用“TOP-N”查詢得到一些有意義的結果集。例如,可
以用下面的例子在EMP表中找出工資最低的五個員工的信息。
例五:

SELECT ename,job,sal,rownum ---Rownum是表內部的一個指示行號的列 FROM ( SELECT ename,job,sal FROM EMP ORDER BY sal)WHERE rownum<=5;

?

五、到此,我們已經了解了四類子查詢,但在使用子查詢時還要注意以下幾點: ? ?
A、 在HAVING子句中也可以使用子查詢。
例:

SELECT deptno,job,AVG(sal) FROM EMP GROUP BY deptno,job HAVING AVG(sal)>(SELECT sal FROM EMP WHERE ename=’MARTIN’);

?

B、 在一些比較復雜的子查詢中,可能需要多次處理同一個子查詢,為了優化這一步驟,ORACLE9i引入了“WITH”子句來提高這類子查詢的性能。
例:

SELECT dname,SUM(sal) AS dept_totalFROM EMP,DEPTWHERE EMP.deptno=DEPT.deptnoGROUP BY dnameHAVING SUM(sal)>(SELECT SUM(sal)*1/3FROM EMP,DEPTWHERE EMP.deptno=DEPT.deptno)ORDER BY SUM(sal) DESC;

?

顯然,子查詢“SELECT SUM(sal) FROM EMP,DEPT WHERE EMP.deptno=DEPT.deptno”處理了兩次。因此,可以利用O9i中的下來語法來改善性能:

WITH summary AS( SELECT dname,SUM(sal) AS dept_total FROM EMP,DEPTWHERE EMP.deptno=DEPT.deptnoGROUP BY dname )SELECT dname,dept_total FROM summaryWHERE dept_total>(SELECT SUM(dept_total)*1/3 FROM summary)ORDER BY dept_total DESC;

?


C、在一些子查詢操作,諸如數據分組,可能會產生空值。然而,在子查詢把這些數據集返回給主查詢時又會忽略空值。因此,應特別小心這種情況。

轉載于:https://www.cnblogs.com/Peyton-for-2012/archive/2013/01/10/2855065.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【转】ORACLE中的子查询 ---OCP--047--46的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。