子查詢是一個嵌套在 SELECT、INSERT、UPDATE 或 DELETE 語句或其他子查詢中的查詢。任何允許使用表達式的地方都可以使用子查詢。在此示例中,子查詢用作 SELECT
語句中名爲 MaxUnitPrice
的列表達式。
USE AdventureWorks2008R2; GO SELECT Ord.SalesOrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice FROM AdventureWorks2008R2.Sales.SalesOrderHeader AS Ord
子查詢也稱爲內部查詢或內部選擇,而包含子查詢的語句也稱爲外部查詢或外部選擇。
許 多包含子查詢的 Transact-SQL 語句都可以改用聯接表示。其他問題只能通過子查詢提出。在 Transact-SQL 中,包含子查詢的語句和語義上等效的不包含子查詢的語句在性能上通常沒有差別。但是,在一些必須檢查存在性的情況中,使用聯接會產生更好的性能。否則,爲 確保消除重複值,必須爲外部查詢的每個結果都處理嵌套查詢。所以在這些情況下,聯接方式會產生更好的效果。以下示例顯示了返回相同結果集的 SELECT 子查詢和 SELECT 聯接:
/* SELECT statement built using a subquery. */ SELECT Name FROM AdventureWorks2008R2.Production.Product WHERE ListPrice = (SELECT ListPrice FROM AdventureWorks2008R2.Production.Product WHERE Name = 'Chainring Bolts' ); /* SELECT statement built using a join that returns the same result set. */ SELECT Prd1. Name FROM AdventureWorks2008R2.Production.Product AS Prd1 JOIN AdventureWorks2008R2.Production.Product AS Prd2 ON (Prd1.ListPrice = Prd2.ListPrice) WHERE Prd2. Name = 'Chainring Bolts';
嵌套在外部 SELECT 語句中的子查詢包括以下組件:
- 包含常規選擇列表組件的常規 SELECT 查詢。
- 包含一個或多個表或視圖名稱的常規 FROM 子句。
- 可選的 WHERE 子句。
- 可選的 GROUP BY 子句。
- 可選的 HAVING 子句。
子查詢的 SELECT 查詢總是使用圓括號括起來。它不能包含 COMPUTE 或 FOR BROWSE 子句,如果同時指定了 TOP 子句,則只能包含 ORDER BY 子句。
子 查詢可以嵌套在外部 SELECT、INSERT、UPDATE 或 DELETE 語句的 WHERE 或 HAVING 子句內,也可以嵌套在其他子查詢內。儘管根據可用內存和查詢中其他表達式的複雜程度的不同,嵌套限制也有所不同,但嵌套到 32 層是可能的。個別查詢可能不支持 32 層嵌套。任何可以使用表達式的地方都可以使用子查詢,只要它返回的是單個值。
如果某個表只出現在子查詢中,而沒有出現在外部查詢中,那麼該表中的列就無法包含在輸出(外部查詢的選擇列表)中。
包含子查詢的語句通常採用以下格式中的一種:
- WHERE expression [NOT] IN ( subquery )
- WHERE expression comparison_operator [ANY | ALL] ( subquery )
- WHERE [NOT] EXISTS ( subquery )
在某些 Transact-SQL 語句中,子查詢可以作爲獨立查詢來計算。從概念上說,子查詢結果會代入外部查詢(儘管這不一定是 Microsoft SQL Server 實際處理帶有子查詢的 Transact-SQL 語句的方式)。
有三種基本的子查詢。它們是:
- 在通過 IN 或由 ANY 或 ALL 修改的比較運算符引入的列表上操作。
- 通過未修改的比較運算符引入且必須返回單個值。
- 通過 EXISTS 引入的存在測試。