語法
可用三種語法來創建子查詢:
comparison [ANY | ALL | SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
子查詢可分為以下幾個部分:
組成部分
comparison 一個表達式及一個比較運算符,將表達式與子查詢的結果作比較。
expression 用以搜尋子查詢結果集的表達式。
sqlstatement SELECT 語句,遵從與其他 SELECT 語句相同的格式及規則。它必須括在括弧之中。
說明
可以拿子查詢代替表達式 用於SELECT 語句欄位表或 WHERE 或 HAVING 子句。在子查詢之中,在 WHERE 或 HAVING 子句的表達式中,用於計算的特定值是由 SELECT 語句提供的。
使用
ANY 或 SOME 謂詞,它們是同義字,來檢索主查詢中的記錄,這些記錄要滿足在子查詢中檢索的任何記錄的比較條件。下列示例將返回全部單價比任何以 25% 或更高的折扣賣出的產品高的產品:
SELECT * FROM Products
WHERE UnitPrice > ANY
(SELECT UnitPrice FROM OrderDetails
WHERE Discount >= .25);
使用 ALL 謂詞只檢索主查詢中的這些記錄,它們滿足在子查詢中檢索的所有記錄的比較條件。如果將前一個示例中的 ANY 改為 ALL,查詢只會返回單價比全部以 25% 或更高的折扣賣出的產品高的產品。這是更多的限制。
用 IN 謂詞,只能在主查詢檢索那些記錄,在子查詢中的某些記錄也包含和它們相同的值。下列示例返回有 25% 或更高的折扣的所有產品:
SELECT * FROM Products
WHERE ProductID IN
(SELECT ProductID FROM OrderDetails
WHERE Discount >= .25);
相反,可用 NOT IN 在主查詢中檢索那樣的記錄,在子查詢中沒有包含與它們的值相同的記錄。
在 true/false 比較中使用 EXISTS 謂詞(與可選的 NOT 保留字一道)來決定子查詢是否會返回任何記錄。
示例
還可用子查詢中的表名別名來查詢子查詢外的 FROM 子句的列表。下列示例返回工資等於或高於所有職位相同員工的平均工資的員工姓名。這張員工表的別名為 "T1":
SELECT LastName,
FirstName, Title, Salary
FROM Employees AS T1
WHERE Salary >=
(SELECT Avg(Salary)
FROM Employees
WHERE T1.Title = Employees.Title) Order by Title;
上例中AS保留詞可選。
某些子查詢在交叉表查詢中是允許的,特別是謂詞(那些在 WHERE 子句中的)。將子查詢作為輸出(那些列在 SELECT 中的)在交叉表查詢中是不允許的。