是的,ANSI SQL 支持子查询(Subquery),而且子查询是 ANSI SQL 标准的重要组成部分。
下面从是否支持、支持的位置、常见类型几个方面简要说明:
✅ ANSI SQL 明确支持子查询,包括:
EXISTS / NOT EXISTSIN / NOT INFROM、WHERE、HAVING、SELECT 等子句不同数据库(如 Oracle、PostgreSQL、MySQL、SQL Server)在子查询支持上基本都遵循 ANSI SQL 标准,只是细节和性能优化略有差异。
SELECT 子句(标量子查询)SELECT
id,
(SELECT MAX(score) FROM scores WHERE scores.user_id = users.id) AS max_score
FROM users;
要求:子查询只能返回 一行一列
FROM 子句(派生表 / 内联视图)SELECT *
FROM (
SELECT user_id, AVG(score) AS avg_score
FROM scores
GROUP BY user_id
) AS t
WHERE avg_score > 80;
✅ ANSI SQL 要求派生表必须有别名。
WHERE 子句SELECT *
FROM users
WHERE id IN (
SELECT user_id FROM scores WHERE score > 90
);
HAVING 子句SELECT user_id, AVG(score)
FROM scores
GROUP BY user_id
HAVING AVG(score) > (
SELECT AVG(score) FROM scores
);
EXISTS / NOT EXISTSSELECT *
FROM users u
WHERE EXISTS (
SELECT 1
FROM scores s
WHERE s.user_id = u.id
);
✅ 这是相关子查询的典型用法。
| 类型 | 是否返回多行 | 是否返回多列 | 示例 |
|---|---|---|---|
| 标量子查询 | 否 | 否 | SELECT (SELECT 1) |
| 行子查询 | 否 | 是 | WHERE (a,b) = (SELECT x,y ...) |
| 表子查询 | 是 | 是 | FROM (SELECT ...) |
| 相关子查询 | 可能 | 可能 | WHERE EXISTS (...) |
ORDER BY 中使用子查询(部分数据库扩展支持)CHECK 约束中(大多数数据库不支持)✅ ANSI SQL 完全支持子查询,并且子查询是 SQL 查询能力强大的核心特性之一。
如果你愿意,我也可以对比 ANSI SQL 与某个具体数据库(如 MySQL / Oracle / PostgreSQL)在子查询上的差异。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。