子查询是嵌套在 SELECT、SELECT...INTO、INSERT...INTO、DELETE 或 UPDATE 语句或其他子查询内。
语法
可以使用三种形式的语法创建子查询:
comparison [ANY |所有|SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NOT]EXISTS (sqlstatement)
子查询包括以下部分:
部分 |
说明 |
比较 |
一 表达式 一个比较运算符,用于将表达式与子查询的结果进行比较。 |
表达式 |
搜索子查询结果集的表达式。 |
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% 或 25% 以上的所有产品:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
相反,可以使用 NOT IN 仅检索主查询中子查询中没有任何记录包含等值的记录。
将 EXISTS 谓词 (与可选的 NOT 保留字) true/false 比较,以确定子查询是否返回任何记录。
还可以在子查询中使用表名称别名来引用子查询外部 FROM 子句中列出的表。 以下示例返回其薪金等于或大于同一职务的所有员工的平均薪资的员工的姓名。 "员工"表的别名为"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 列表中的) 作为输出的子查询。