SQL 子查询

重要:  本文是由机器翻译的,请参阅免责声明。请在 此处 中查找本文的英文版本以便参考。

子查询是嵌套于 SELECT、SELECT...INTO、INSERT...INTO、DELETE 或 UPDATE 语句内部或嵌套于另一个子查询内部的 SELECT 语句。

语法

可以使用三种格式的语法来创建子查询:

comparison [ANY | ALL | SOME] (sqlstatement)

expression [NOT] IN (sqlstatement)

[NOT] EXISTS (sqlstatement)

子查询包含以下部分:

部分

描述

comparison

表达式和用于将该表达式与子查询的结果进行比较的比较运算符。

expression

将在其中搜索子查询结果集的表达式。

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 来只检索主查询中的子查询内不包含相等值的记录。

在 True/False 比较中使用 EXISTS 谓词(具有可选的 NOT 保留字)可以确定子查询是否返回任何记录。

还可以在子查询中使用表名称的别名来引用在子查询外部的 FROM 子句中列出的表。以下示例返回其薪金等于或大于相同工作职务的所有雇员平均薪金的雇员的姓名。“雇员 (Employees)”表的别名设定为“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 列表中)。



注意: 机器翻译免责声明:本文是由无人工介入的计算机系统翻译的。Microsoft 提供机器翻译是为了帮助非英语国家/地区用户方便阅读有关 Microsoft 产品、服务和技术的内容。由于机器翻译的原因,本文可能包含词汇、语法或文法方面的错误。

扩展你的技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×