ORACLE復雜查詢之子查詢


  子查詢分為兩類:標准子查詢和相關子查詢。

一、標准子查詢:子查詢先於主查詢獨立執行,返回明確結果供主查詢使用。

  子查詢只執行一次,不依賴於主查詢

例如

  其中子查詢能夠返回結果:2450。所以斷定其為標准子查詢

1、單行子查詢(子查詢返回的結果是單行單列

  WHERE子句中使用單行子查詢時,可以使用單行比較運算符(=,>,>=,<,<=,<>),將子查詢的返回結果當做單一數值來使用。

  需要小心的是子查詢返回的結果的不確定定,即返回空值或多值。具體分為三種情況:

(1)返回單行:即為單行子查詢。

(2)未返回任何行:如果子查詢未返回任何行(相當於返回NULL),則主查詢將不再執行,所以主查詢也不會返回任何結果

(3)返回多行:是多行子查詢,此時不允許使用單行比較運算符,否則出錯。

2、多行子查詢(子查詢返回多行單列

  在WHERE子句中使用多行子查詢時,可以使用多行比較運算符(IN,ALL,ANY),將子查詢的返回結果當做數值集合來使用。其中,ALL和ANY運算符必須與單行比較運算符(=,>,>=,<,<=,<>)結合使用。例如WHERE sal>ALL(子查詢)。

  IN:等於任何一個

  ALL:和子查詢返回的所有值比較。例如:sal>ALL(1,2,3)等價於sal>3,即大於所有。

  ANY:和子查詢返回的任意一個值比較。例如:sal>ANY(1,2,3)等價於sal>1,即大於任意一個就可以。

  EXISTS:判斷子查詢是否有返回結果(不關心具體行數和內容),如果返回則為TRUE,否則為FALSE。(常用於相關子查詢)

3、多列子查詢(子查詢返回多列,可以是單行、多行或者不返回任何結果)

  在WHERE子句中使用多列子查詢時,

a.如果返回結果是單行多列,則可以使用單行比較運算符;例如

b.如果返回結果是多行多列,則只能使用多行比較運算符(IN,ALL,ANY);例如:

c.如果未返回結果,則主查詢也不返回結果

二、相關子查詢:子查詢不能提前運行以得到明確結果

  子查詢執行過程中需要用到主查詢的相關結果,即子查詢在主查詢返回的結果集上執行(針對主查詢的每一行結果,子查詢都要執行一次)。子查詢和主查詢在執行過程中相互依賴

例1:SELECT字段列表中使用子查詢

  其中,只看子查詢,發現emp.deptno=dept.deptno中的emp並不存在與子查詢的FROM語句中,而是存在於外層的主查詢中,所以斷定其為相關子查詢。

等價於:

  可見,等價后的WHERE中增加了一個條件。

例2:WHERE子句中使用子查詢

等價於:

  可見,等價后的WHERE子句中增加了一個條件。

例3:WHERE子句中使用EXISTS(子查詢)

等價於:

  注意這里使用DISTINCT的原因。第一個查詢是從dept中查出的,所有不會重復,但第二個查詢是連接查詢,會有重復的內容(emp表中的不同員工可能屬於同一部門,即一個部門可能有超過一名員工),所以要用DISTINCT去重。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM