在 SQL 语言中,当一个查询语句嵌套在另一个查询的查询条件之中时,称为子查询。子查
询总是写在圆括号中,可以用在使用表达式的任何地方。 如:嵌套在 Select 、Insert
、Update 或 Delete 语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用
子查询。子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选
择。
许多包含子查询的 Transact-SQL 语句都可以改用联接表示。在 Transact-SQL 中,包含
子查询的语句和语义上等效的不包含子查询的语句在性能上通常没有差别。但是,在一些必
须检查存在性的情况中,使用联接会产生更好的性能。否则,为确保消除重复值,必须为外
部查询的每个结果都处理嵌套查询。所以在这些情况下,联接方式会产生更好的效果。
以下示例显示了返回相同结果集的 Select 子查询和 Select 联接:
Select Name
FROM AdventureWor ks.Production.Product
Where ListPrice =
(Select ListPrice
FROM AdventureWor ks.Production.Product
Where Name = ’Chainring Bolts’ )
Select Prd1. Name
FROM AdventureWor ks.Production.Product AS Prd1
JOIN AdventureWor ks.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 子句,则只能包含 or DER BY 子句。
子查询可以嵌套在外部 Select,Insert,Update 或 Delete 语句的 Where 或 HAVING
子句内,也可以嵌套在其他子查询内。尽管根据可用内存和查询中其他表达式的复杂程度的
不同,嵌套限制也有所不同,但嵌套到 32 层是可能的。个别查询可能不支持 32 层嵌套。
任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。