适用于:
SQL Server(所有支持的版本)
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
并行数据仓库
子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其他子查询中的查询。
备注
本文中的示例使用可在AdventureWorks 示例数据库中下载的 AdventureWorks2016 数据库。
任何允许使用表达式的地方都可以使用子查询。 在此示例中,子查询用作SELECT语句中名为 MaxUnitPrice 的列表达式。
USE AdventureWorks2016; GO SELECT Ord.SalesOrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM Sales.SalesOrderDetail AS OrdDet WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice FROM Sales.SalesOrderHeader AS Ord; GO
子查询基础知识
子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。
许多包含子查询的 Transact-SQL 语句都可以改用联接表示。 其他问题只能通过子查询提出。 在Transact-SQL 中,包含子查询的语句和语义上等效的不包含子查询的语句在性能上通常没有差别。 有关 SQL Server 如何处理查询的体系结构信息,请参阅SQL 语句处理。但是,在必须检查存在性的某些情况下,联接会产生更好的效果。 否则,为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。 所以在这些情况下,联接方式会产生更好的效果。
以下示例显示了返回相同结果集和执行计划的SELECT子查询和SELECT联接:
USE AdventureWorks2016; GO /* SELECT statement built using a subquery. */ SELECT [Name] FROM Production.Product WHERE ListPrice = (SELECT List