数据库自连接(Self Join) 本质上是同一张表当成两张表来连接,常用于“层级关系”“同表比较”等场景,比如员工与上级、商品与同类商品、评论与回复等。
自连接就是:一张表和自己进行 JOIN,必须使用表别名来区分“左表”和“右表”。
SELECT
a.列1,
b.列2
FROM 表名 a
JOIN 表名 b
ON a.关联字段 = b.关联字段;
关键点:a 和 b 是同一张表的不同别名
| id | name | manager_id |
|---|---|---|
| 1 | 张三 | NULL |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
| 4 | 赵六 | 2 |
SELECT
e.name AS 员工,
m.name AS 上级
FROM employee e
LEFT JOIN employee m
ON e.manager_id = m.id;
| 员工 | 上级 |
|---|---|
| 张三 | NULL |
| 李四 | 张三 |
| 王五 | 张三 |
| 赵六 | 李四 |
例如:找出同一城市的两个用户
SELECT
a.name,
b.name
FROM user a
JOIN user b
ON a.city = b.city
AND a.id < b.id;
✅ 必须使用别名
✅ 注意避免重复数据(可用 < 或 DISTINCT)
✅ 层级深时,考虑 递归查询(CTE)
WITH RECURSIVE cte AS (
SELECT id, name, manager_id
FROM employee
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employee e
JOIN cte ON e.manager_id = cte.id
)
SELECT * FROM cte;
如果你有具体表结构或业务场景(比如订单、评论、分类),我可以直接帮你写自连接 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。