在 SQL 中,**Subquery(子查询)**和 Join(连接)都常用于从多个表中取数,但它们的写法、执行逻辑和使用场景有明显区别。下面从多个维度对比说明。
子查询是嵌套在另一条 SQL 语句中的查询,通常出现在:
SELECTFROMWHEREHAVING示例:
SELECT name
FROM employees
WHERE department_id = (
SELECT id
FROM departments
WHERE name = 'IT'
);
Join 是将多张表按照关联条件合并成一张结果集,常见有:
INNER JOINLEFT JOINRIGHT JOINFULL JOIN示例:
SELECT e.name
FROM employees e
JOIN departments d
ON e.department_id = d.id
WHERE d.name = 'IT';
| 对比维度 | Subquery(子查询) | Join(连接) |
|---|---|---|
| 数据结构 | 嵌套查询,逻辑上“先查再比” | 表与表横向拼接 |
| 可读性 | 复杂时可读性差 | 结构清晰,易理解 |
| 性能 | 某些情况重复执行,较慢 | 通常优化更好,性能更优 |
| 使用场景 | 判断存在、聚合结果、单行值 | 多表字段同时展示 |
| 能否返回多列 | 通常受限 | 可轻松返回多表字段 |
| 是否存在重复行 | 一般不会 | LEFT JOIN 可能产生重复 |
SELECT name
FROM employees e
WHERE EXISTS (
SELECT 1
FROM departments d
WHERE d.id = e.department_id
);
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary) FROM employees
);
SELECT e.name, d.name
FROM employees e
JOIN departments d ON e.department_id = d.id;
SELECT d.name, COUNT(e.id)
FROM departments d
LEFT JOIN employees e ON d.id = e.department_id
GROUP BY d.name;
IN + 大表)可能被执行多次例如:
-- 可能慢
SELECT * FROM A
WHERE id IN (SELECT id FROM B);
优化方式:
SELECT A.*
FROM A
JOIN B ON A.id = B.id;
但现代数据库(MySQL 8+、PostgreSQL)会对很多子查询做优化,差距在缩小。
Join 用来“把表连起来看”,Subquery 用来“先算一个结果再判断”。
如果你有具体 SQL 场景,我可以直接帮你判断该用哪种写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。