如何编写单个SQL查询获取员工表中员工与对应经理的姓名?
获取员工及其对应经理姓名的SQL查询方案
嘿,作为刚入门SQL的新手,碰到这种需要从同一张表关联出上下级关系的问题很常见,咱们用自连接就能轻松解决!
核心思路:自连接(Self-Join)
你的Employee表同时存储了员工和经理的信息——经理本身也是员工(有自己的id),所以我们可以把这张表当成两个独立的表来用:一个代表员工,一个代表经理,通过员工的manager_id = 经理的id这个条件来关联它们。
基础SQL查询(仅含有经理的员工)
如果只需要查询有直属经理的员工,用INNER JOIN就可以:
SELECT emp.name AS 员工姓名, mgr.name AS 经理姓名 FROM Employee emp INNER JOIN Employee mgr ON emp.manager_id = mgr.id;
- 这里给表起了别名
emp(员工表)和mgr(经理表),避免字段名冲突,也让SQL更易读。 ON emp.manager_id = mgr.id是核心关联条件:员工的经理ID等于经理的员工ID。
包含无经理员工的查询(全覆盖)
如果有些员工没有经理(比如公司老板,manager_id为NULL),想要把这些员工也纳入结果,就用LEFT JOIN:
SELECT emp.name AS 员工姓名, COALESCE(mgr.name, '无经理') AS 经理姓名 FROM Employee emp LEFT JOIN Employee mgr ON emp.manager_id = mgr.id;
LEFT JOIN会保留左表(员工表)的所有记录,即使没有匹配的经理记录。COALESCE函数用来把NULL(无经理时的默认结果)替换成更友好的文字,比如“无经理”。
实际数据示例
假设你的Employee表数据如下:
| id | name | manager_id |
|---|---|---|
| 1 | BBB | NULL |
| 2 | AAA | 1 |
| 3 | CCC | 1 |
| 4 | DDD | 3 |
用左连接的查询结果会是:
| 员工姓名 | 经理姓名 |
|---|---|
| BBB | 无经理 |
| AAA | BBB |
| CCC | BBB |
| DDD | CCC |
这样就能清晰看到每个员工对应的经理啦!
内容的提问来源于stack exchange,提问作者srik123
相关产品推荐
相关产品推荐

