自连接
自连接(Self Join)是一种特殊的连接方式,指同一张表与自身进行连接。
在实际开发中,自连接常用于表示层级、父子关系或上下级从属关系,例如“员工与其上级”、“分类与父分类”、“地区与上级地区”等。
1. 基本语法
Section titled “1. 基本语法”自连接的关键在于——同一张表取不同的别名,从而让数据库将它们视为两张独立的表进行匹配。
SELECT 查询字段FROM 表A AS aINNER JOIN 表A AS b ON a.字段名 = b.字段名;- 由于是同一张表,必须使用不同的别名;
- 通常需要指定不同的逻辑角色(如“员工表的上级” vs “员工表的下属”)。
2. 员工与上级
Section titled “2. 员工与上级”假设有一张员工表 employee:
| emp_id | emp_name | manager_id |
|---|---|---|
| 1 | 张三 | NULL |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
| 4 | 赵六 | 2 |
我们希望查询每个员工的上级姓名:
SELECT e.emp_name AS 员工姓名, m.emp_name AS 上级姓名FROM employee AS eLEFT JOIN employee AS mON e.manager_id = m.emp_id;结果:
| 员工姓名 | 上级姓名 |
|---|---|
| 张三 | NULL |
| 李四 | 张三 |
| 王五 | 张三 |
| 赵六 | 李四 |
说明: 这里用
LEFT JOIN是为了保留所有员工,即使有些员工(如张三)没有上级。
3. 自连接的应用场景
Section titled “3. 自连接的应用场景”- 层级结构查询(如地区、省市区、部门树);
- 父子节点关系(如分类、菜单);
- 递归数据处理(结合
WITH RECURSIVE语法); - 比较同表中不同行的属性差异(如查找同部门工资最高的员工)。
4. 性能注意事项
Section titled “4. 性能注意事项”- 自连接相当于同表多次扫描;
- 若数据量大,应确保连接字段(如
manager_id)上有索引; - 若层级关系较深,可配合 CTE(公用表表达式) 或递归查询。
WITH RECURSIVE dept_tree AS ( SELECT id, dept_name, parent_id FROM sys_dept WHERE parent_id IS NULL UNION ALL SELECT d.id, d.dept_name, d.parent_id FROM sys_dept d INNER JOIN dept_tree t ON d.parent_id = t.id)SELECT * FROM dept_tree;对于树形结构数据,递归 CTE 比多层自连接更直观。