SQL自连接是同一张表与自身连接,需用不同别名避免歧义,典型应用包括查员工及其上级(如LEFT JOIN employees e ON e.manager_id=m.id)和同部门员工配对(如JOIN employees a ON a.dept_id=b.dept_id)。

SQL 自连接是指一张表与自身进行连接操作,通常用于处理表中存在层级关系、前后关联或需要横向对比的场景。它不依赖其他表,但必须为同一张表起不同的别名,避免字段歧义。
查询员工及其直属上级信息
这是最经典的自连接用例。员工表中通常有 manager_id 字段指向同一张表的 id,表示谁是其上级。
示例 SQL:
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
使用 LEFT JOIN 可保留无上级(如 CEO)的员工;若只查有上级的员工,可用 INNER JOIN。
查找同一部门内的员工配对(如协作关系)
当需要分析同部门内两两组合(例如统计某部门有多少对员工),可对同一张员工表按部门自连接。
示例 SQL:
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.dept_id = b.dept_id
WHERE a.id
条件 a.id 防止重复配对(如 A-B 和 B-A)并排除自配(A-A)。
获取时间序列中的前一行/后一行数据
在没有窗口函数(如 LAG/LEAD)的老版本数据库中,常通过自连接模拟“相邻记录”逻辑,比如计算每日销售额环比。
关键技巧:用日期字段做偏移匹配。
示例(找前一天的销售额):
SELECT t1.date, t1.amount,
t2.amount AS prev_amount
FROM sales t1
LEFT JOIN sales t2 ON t2.date = DATE_SUB(t1.date, INTERVAL 1 DAY);
注意:该方式依赖日期连续且无缺失;有空缺时结果可能不准确,推荐优先使用窗口函数。
识别组织架构中的间接上下级(如经理的经理)
通过多层自连接,可展开两级甚至三级汇报关系。
示例(员工 → 直属经理 → 经理的经理):
SELECT e.name AS employee,
m1.name AS direct_manager,
m2.name AS senior_manager
FROM employees e
JOIN employees m1 ON e.manager_id = m1.id
JOIN employees m2 ON m1.manager_id = m2.id;
每增加一层管理链,就加一次 JOIN;但超过三层后建议改用递归 CTE,更清晰且可扩展。










