子查詢分為兩類:標准子查詢和相關子查詢。
一、標准子查詢:子查詢先於主查詢獨立執行,返回明確結果供主查詢使用。
子查詢只執行一次,不依賴於主查詢。
例如:

其中子查詢能夠返回結果: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去重。
