在 SQL 中,子查询(Subquery)和连接(JOIN)都可用于从多个表中获取数据,但它们的写法、执行逻辑、适用场景和性能特点不同。下面从多个角度对比说明。
子查询是嵌套在另一条 SQL 语句中的查询,通常出现在 SELECT、FROM、WHERE、HAVING 中。
示例:
SELECT name
FROM employees
WHERE department_id = (
SELECT id FROM departments WHERE name = 'IT'
);
连接是通过关联条件将多张表“拼成一张大表”再查询。
示例:
SELECT e.name
FROM employees e
JOIN departments d
ON e.department_id = d.id
WHERE d.name = 'IT';
| 对比维度 | 子查询 | 连接(JOIN) |
|---|---|---|
| 逻辑结构 | 嵌套查询,先查内再查外 | 表先合并,再统一过滤 |
| 可读性 | 简单逻辑清晰,复杂时难懂 | 多表关系直观 |
| 性能 | 可能多次执行(尤其相关子查询) | 通常更优(尤其大表) |
| 使用场景 | 判断存在、聚合比较、单行结果 | 多表字段同时展示 |
| 返回结果 | 常用于条件或标量 | 常用于结果集 |
SELECT name
FROM employees
WHERE EXISTS (
SELECT 1 FROM departments
WHERE departments.id = employees.department_id
);
SELECT name
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees
);
SELECT e.name, d.name
FROM employees e
JOIN departments d ON e.department_id = d.id;
SELECT *
FROM orders o
JOIN customers c ON o.customer_id = c.id;
❌ 举例(低效):
SELECT name
FROM employees e
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
);
✅ 改写为 JOIN + 聚合通常更高效
很多时候可以,但不总是。
IN 子查询 ⇄ JOINEXISTS 子查询 ⇄ JOIN(更偏语义)JOIN + GROUP BY子查询强调“逻辑嵌套”,JOIN 强调“表关系合并”
简单判断用子查询,多表取数用 JOIN,性能优先用 JOIN
如果你有具体 SQL 场景,我可以帮你判断该用哪种更合适。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。