子查詢是巢狀在 SELECT, SELECT... 內嵌的 SELECT 語句...INTO, INSERT...INTO、DELETE 或 UPDATE 語句,或在其他子查詢內。
語法
您可以使用三種形式的語法來建立子查詢:
比較 [ANY |全部 |SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NOT]存在 (sqlstatement)
子查詢由下列各部分組成:
部分 |
描述 |
比較 |
比較表達式與子查詢結果的 運算式 運算子和比較運算符。 |
運算式 |
搜尋子查詢結果集的表達式。 |
sqlstatement |
SELECT 語句,遵循與任何其他 SELECT 語句相同的格式和規則。 它必須以括弧括住。 |
註解
您可以在 SELECT 語句的欄位清單或 WHERE 或 HAVING 子句中,使用子查詢來取代表達式。 在子查詢中,您可以使用 SELECT 語句提供一組或多個特定值,以便在 WHERE 或 HAVING 子句運算式中進行評估。
使用 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 在主要查詢中只擷取這些記錄,而子查詢中沒有記錄包含等值。
使用 EXISTS 述詞 (搭配 true/false 比較選用的 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 清單) 中的子查詢。