子查询是嵌套在 SELECT 中的 SELECT 语句, SELECT...INTO、INSERT...INTO、DELETE 或 UPDATE 语句或在另一个子查询中。
语法
可以使用三种语法形式创建子查询:
比较 [ANY |ALL |SOME] (sqlstatement)
表达式 [NOT] IN (sqlstatement)
[NOT]EXISTS (sqlstatement)
子查询包含以下部分:
部分 |
说明 |
比较 |
一个 表达式 和一个比较运算符,用于将表达式与子查询的结果进行比较。 |
表达式 |
为其搜索子查询的结果集的表达式。 |
sqlstatement |
SELECT 语句,遵循与任何其他 SELECT 语句相同的格式和规则。 它必须用括号括起来。 |
备注
可以在 SELECT 语句的字段列表或 WHERE 或 HAVING 子句中使用子查询而不是表达式。 在子查询中,使用 SELECT 语句提供一组在 WHERE 或 HAVING 子句表达式中计算的一个或多个特定值。
使用 ANY 或 SOME 谓词(同义词)检索main查询中满足与子查询中检索到的任何记录的比较的记录。 以下示例返回其单价高于以 25% 或更高折扣销售的任何产品的所有产品:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
使用 ALL 谓词仅检索main查询中满足与子查询中检索的所有记录进行比较的那些记录。 如果在上一示例中将 ANY 更改为 ALL,则查询将仅返回单价高于以 25% 或更多折扣销售的所有产品的产品。 这要严格得多。
使用 IN 谓词仅检索main查询中的某些记录包含相等值的那些记录。 以下示例返回折扣为 25% 或更高的所有产品:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
相反,可以使用 NOT IN 仅在main查询中检索子查询中没有包含相等值的记录。
在 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 列表) 中的子查询作为输出 (子查询。