数据库自连接(Self Join) 是指一张表自己和自己进行连接的查询方式。它本质上是内连接或外连接的一种特例,只是在 FROM 中把同一张表起两个不同的别名。
核心用途只有一句话:
用“行与行之间的关系”代替“列与列之间的关系”来解决查询问题。
当一张表中数据之间存在层级、先后、配对、对照关系时,就需要自连接。
例如员工表中包含 manager_id:
employee
+----+--------+------------+
| id | name | manager_id |
+----+--------+------------+
| 1 | 张三 | NULL |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
+----+--------+------------+
查询员工及其上级姓名:
SELECT e.name AS 员工, m.name AS 上级
FROM employee e
LEFT JOIN employee m
ON e.manager_id = m.id;
✅ 自连接把“员工—上级”这种层级关系暴露出来。
例如订单历史表:
order_log
+---------+---------+---------+
| order_id| status | date |
+---------+---------+---------+
| 1001 | 创建 | 2024-01-01 |
| 1001 | 完成 | 2024-01-03 |
+---------+---------+---------+
查询每个订单的创建和完成时间:
SELECT a.order_id, a.date AS 创建时间, b.date AS 完成时间
FROM order_log a
JOIN order_log b
ON a.order_id = b.order_id
AND a.status = '创建'
AND b.status = '完成';
例如温度记录表:
SELECT a.date, b.date, a.temp - b.temp AS 温差
FROM temperature a
JOIN temperature b
ON a.date = b.date + 1;
例如从同一张“学生表”中:
SELECT a.name, b.name
FROM student a
JOIN student b
ON a.birthday = b.birthday
AND a.id < b.id;
因为:
| 对比项 | 自连接 | 子查询 |
|---|---|---|
| 性能 | 通常更好 | 可能更慢 |
| 可读性 | 结构清晰 | 有时直观 |
| 适合场景 | 行关系 | 聚合/存在判断 |
当一张表里的“某一行”需要参考“另一行”时,就用自连接。
如果你愿意,我可以用你实际业务表(员工、评论、订单、分类等)写一个具体例子。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。