SELECT Ord.OrderID, Ord.OrderDate,
(SELECT MAX(OrdDet.UnitPrice)
FROM Northwind.dbo.[Order Details] AS OrdDet
WHERE Ord.OrderID = OrdDet.OrderID) AS MaxUnitPrice
FROM Northwind.dbo.Orders AS Ord
/* SELECT statement built using a subquery. */
SELECT ProductName
FROM Northwind.dbo.Products
WHERE UnitPrice =
(SELECT UnitPrice
FROM Northwind.dbo.Products
WHERE ProductName = 'Sir Rodney''s Scones')
/* SELECT statement built using a join that returns
the same result set. */
SELECT Prd1.ProductName
FROM Northwind.dbo.Products AS Prd1
JOIN Northwind.dbo.Products AS Prd2
ON (Prd1.UnitPrice = Prd2.UnitPrice)
WHERE Prd2.ProductName = 'Sir Rodney''s Scones'
嵌套在外部 SELECT 语句中的子查询包括以下组件:
包含标准选择列表组件的标准 SELECT 查询。
包含一个或多个表或者视图名的标准 FROM 子句。
可选的 WHERE 子句。
可选的 GROUP BY 子句。
可选的 HAVING 子句。
子查询的 SELECT 查询总是使用圆括号括起来。且不能包括 COMPUTE 或 FOR BROWSE 子句,如果同时指定 TOP 子句,则可能只包括 ORDER BY 子句。
子查询可以嵌套在外部 SELECT、INSERT、UPDATE 或 DELETE 语句的 WHERE 或 HAVING 子句内,或者其它子查询中。尽管根据可用内存和查询中其它表达式的复杂程度不同,嵌套限制也有所不同,但嵌套到 32 层是可能的。个别查询可能会不支持 32 层嵌套。任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。
USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id IN
(SELECT au_id
FROM titleauthor
WHERE title_id IN
(SELECT title_id
FROM titles
WHERE type = 'popular_comp'))
最内部的查询返回书名 ID 号 PC1035、PC8888 和 PC9999。再上一层的查询使用这些书名 ID 进行评估,并返回作者的 ID 号。最后,外部查询使用作者的 ID 号查找作者的姓名。
也可以使用一个联接表示该查询:
USE pubs
SELECT au_lname, au_fname
FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id
WHERE type = 'popular_comp'
相关子查询
许多查询都可以通过执行一次子查询并将结果值代入外部查询的 WHERE 子句进行评估。在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。
下面的查询查找获得某本书 100 % 共享版税 (royaltyper) 的所有作者名。
USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE 100 IN
(SELECT royaltyper
FROM titleauthor
WHERE titleauthor.au_ID = authors.au_id)
下面是结果集:
au_lname au_fname
---------------------------------------- --------------------
White Johnson
Green Marjorie
Carson Cheryl
Straight Dean
Locksley Charlene
Blotchet-Halls Reginald
del Castillo Innes
Panteley Sylvia
Ringer Albert