自连接(Self Join)和子查询(Subquery)是 SQL 中两种不同思路的查询方式,它们都可以用来解决“在同一张表里比较或关联数据”的问题,但写法、执行逻辑和使用场景有明显区别。
下面从多个角度对比说明。
同一张表自己和自己连接,在 FROM 中子表使用别名。
SELECT a.name, b.name
FROM employee a
JOIN employee b
ON a.manager_id = b.id;
✅ 本质是:把一张表当成两张表来用
一个查询嵌套在另一个查询中,通常出现在 WHERE、FROM、SELECT 中。
SELECT name
FROM employee
WHERE salary > (
SELECT AVG(salary)
FROM employee
);
✅ 本质是:先算一个小结果,再用于外层判断
| 对比维度 | 自连接 | 子查询 |
|---|---|---|
| 是否多张“表” | 是(同一表别名成多张) | 否 |
| 主要用途 | 行与行之间比较 | 条件判断、聚合结果 |
| 是否返回多列 | 很容易 | 通常受限 |
| 执行方式 | 表连接 | 嵌套执行 |
| 可读性 | 结构清晰但易复杂 | 逻辑直观 |
| 性能 | 大表可能较慢 | 取决于是否相关子查询 |
-- 找工资比经理高的员工
SELECT e.name
FROM employee e
JOIN employee m
ON e.manager_id = m.id
WHERE e.salary > m.salary;
-- 工资高于平均工资的员工
SELECT name
FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee);
✅ 很多时候:
自连接 ↔ 子查询 可互相改写
例如:
-- 子查询
WHERE salary > (SELECT AVG(salary) FROM employee)
-- 可改写为自连接(不常用)
自连接是“横向比较”,子查询是“纵向判断”
如果你愿意,我可以给你一个同一个需求分别用自连接和子查询实现的对比示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。