🔍 核心知识点提取
1. 表结构与业务关系
-
表名:
Employee -
关键字段:
id:员工主键,唯一标识name:员工姓名salary:员工薪资managerId:员工直属经理的id(为Null时表示该员工本身是经理,无上级)
-
业务逻辑:员工与经理是自关联关系,通过
managerId关联到同表中另一条经理记录的id。
2. SQL 解题核心思路
(1)自连接查询(最常用)
将Employee表自连接,分别代表员工表(e)和经理表(m):
sql
SELECT e.name AS Employee
FROM Employee e
JOIN Employee m
ON e.managerId = m.id -- 关联员工和其经理
WHERE e.salary > m.salary; -- 筛选员工薪资 > 经理薪资
- 关键:通过
managerId = id建立员工与经理的映射,再比较两者薪资。
(2)子查询方式(另一种实现)
先查询所有经理的薪资,再用子查询筛选:
sql
SELECT name AS Employee
FROM Employee e
WHERE salary > (
SELECT salary
FROM Employee
WHERE id = e.managerId
);
- 注意:需保证每个员工都有对应的经理(即
managerId不为Null),否则子查询会返回Null导致结果异常。
3. 关键语法与概念
- 自连接(Self Join) :同一张表与自身进行连接,用于处理表内存在层级关系的场景(如员工 - 经理、组织架构)。
- 关联条件:
e.managerId = m.id是核心,确保每条员工记录匹配到其直属经理的记录。 - 过滤条件:
e.salary > m.salary实现 “收入比经理高” 的业务需求。 - 结果别名:使用
AS Employee将输出列名改为题目要求的格式。
4. 边界情况处理
- 无经理的员工:
managerId为Null的记录(即经理本人)不会出现在结果中,因为他们没有上级经理可以比较薪资。 - 数据完整性:若
managerId引用了不存在的id,连接会自动过滤掉这条无效数据,避免错误。
5. Pandas 实现思路(对应 Pandas Schema)
如果用 Pandas 处理,核心是合并 + 过滤:
python
运行
import pandas as pd
def find_employees(employee: pd.DataFrame) -> pd.DataFrame:
# 自连接,匹配员工和经理
merged = employee.merge(employee, left_on='managerId', right_on='id', suffixes=('_emp', '_mgr'))
# 筛选薪资更高的员工
result = merged[merged['salary_emp'] > merged['salary_mgr']][['name_emp']]
# 重命名列名
result.columns = ['Employee']
return result
- 逻辑与 SQL 一致:先合并关联,再筛选比较。
💡 总结
这道题的核心是自连接 / 自关联的应用,本质是处理表内的层级数据关系,同时考察条件筛选和别名使用的基础语法。