概念
子查詢,也稱為嵌套查詢或子選擇,是SELECT嵌入在另一個SQL查詢的WHERE或HAVING子句中的查詢。子查詢返回的數據由外部語句使用,與使用文字值的方式相同。
子查詢提供了一種簡單而有效的方法來處理依賴于另一個查詢結果的查詢。它們幾乎與普通的SELECT語句相同,但幾乎沒有限制。最重要的幾點如下:
子查詢必須始終出現在括号内。
子查詢必須隻返回一列。這意味着不能在子查詢中使用SELECT*,除非所引用的表隻有一列。如果目的是行比較,可以使用返回多列的子查詢。
您隻能使用返回多個值運算符(例如IN或NOTIN運算符)的多行的子查詢。
子查詢不能是UNION。隻允許一個SELECT語句。
子查詢最常與SELECT語句一起使用,但是也可以在INSERT,UPDATE或DELETE語句中或在另一個子查詢中使用它們。
語法
可用三種語法來創建子查詢:
comparison[ANY|ALL|SOME](sqlstatement)
expression[NOT]IN(sqlstatement)
[NOT]EXISTS(sqlstatement)
子查詢可分為以下幾個部分:
組成部分
comparison一個表達式及一個比較運算符,将表達式與子查詢的結果作比較。
expression用以搜尋子查詢結果集的表達式。
sqlstatementSELECT語句,遵從與其他SELECT語句相同的格式及規則。它必須括在括号之中。
說明
可以拿子查詢代替表達式用于SELECT語句字段表或WHERE或HAVING子句。在子查詢之中,在WHERE或HAVING子句的表達式中,用于計算的特定值是由SELECT語句提供的。
使用
ANY或SOME謂詞,它們是同義字,來檢索主查詢中的記錄,這些記錄要滿足在子查詢中檢索的任何記錄的比較條件。下列示例将返回全部單價比任何以25%或更高的折扣賣出的産品高的産品:
SELECT*FROMProducts
WHEREUnitPrice>ANY
(SELECTUnitPriceFROMOrderDetails
WHEREDiscount>=.25);
使用ALL謂詞隻檢索主查詢中的這些記錄,它們滿足在子查詢中檢索的所有記錄的比較條件。如果将前一個示例中的ANY改為ALL,查詢隻會返回單價比全部以25%或更高的折扣賣出的産品高的産品。這是更多的限制。
用IN謂詞,隻能在主查詢檢索那些記錄,在子查詢中的某些記錄也包含和它們相同的值。下列示例返回有25%或更高的折扣的所有産品:
SELECT*FROMProducts
WHEREProductIDIN
(SELECTProductIDFROMOrderDetails
WHEREDiscount>=.25);
相反,可用NOTIN在主查詢中檢索那樣的記錄,在子查詢中沒有包含與它們的值相同的記錄。
在true/false比較中使用EXISTS謂詞(與可選的NOT保留字一道)來決定子查詢是否會返回任何記錄。
示例
還可用子查詢中的表名别名來查詢子查詢外的FROM子句的列表。下列示例返回工資等于或高于所有職位相同員工的平均工資的員工姓名。這張員工表的别名為"T1":
SELECTLastName,
FirstName,Title,Salary
FROMEmployeesAST1
WHERESalary>=
(SELECTAvg(Salary)
FROMEmployees
WHERET1.Title=Employees.Title)OrderbyTitle;
上例中AS保留詞可選。
某些子查詢在交叉表查詢中是允許的,特别是謂詞(那些在WHERE子句中的)。将子查詢作為輸出(那些列在SELECT中的)在交叉表查詢中是不允許的。