例题:
表:Employee
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | | salary | int | | managerId | int | +-------------+---------+ id 是该表的主键(具有唯一值的列)。 该表的每一行都表示雇员的ID、姓名、工资和经理的ID。
要求:编写解决方案,找出收入比经理高的员工。以 任意顺序 返回结果表。
分析:Employee 表包含员工ID、姓名、工资、经理ID(managerId
指向同表的 id
)
自连接(Self-Join):将 Employee
表视为两个角色:e(
普通员工)和 m(
员工的直接经理),通过 e.managerId = m.id
建立连接,将每个员工与其经理的记录关联。过滤条件:使用 WHERE e.salary > m.salary
筛选出工资高于经理的员工。
代码:
SELECT e.name AS Employee --经理姓名
FROM Employee as e
JOIN Employee as m ON e.managerId = m.id --将同一张表连接两次,分别表示员工(e)和经理(m)
WHERE e.salary > m.salary; --筛选员工工资大于经理工资
类似的题:
题目1:查询每个经理的下属人数
Employee 表:id, name, salary, managerId
需求:统计每个经理(有下属的员工)管理的下属人数,返回经理姓名及下属数量,按人数降序排列。
SELECT
m.name AS manager_name, -- 显示经理姓名
COUNT(e.id) AS subordinate_count -- 统计下属数量
FROM Employee AS m -- 将表别名为 m(代表经理)
JOIN Employee AS e -- 将表别名为 e(代表下属)
ON m.id = e.managerId -- 关联条件:经理的 id = 下属的 managerId
GROUP BY m.id, m.name -- 按经理的 id 和 name 分组
ORDER BY subordinate_count DESC; -- 按下属数量降序排列
题目2:查询下属中存在工资高于自己的经理
Employee 表:id, name, salary, managerId
需求:找出哪些经理的下属中至少有一人的工资比自己高,返回这些经理的姓名及其下属的最高工资。
SELECT
m.name AS manager_name, --经理姓名
MAX(e.salary) AS max_subordinate_salary --最高工资下属
FROM Employee as m
JOIN Employee as e ON m.id = e.managerId -- 自连接:经理与下属关联
GROUP BY m.id, m.name --分组
HAVING max_subordinate_salary > m.salary; -- 过滤下属最高工资 > 经理工资
题目3:查询工资高于所有下属的经理
Employee 表:id, name, salary, managerId
需求:找出工资高于其所有下属的经理,返回经理姓名。
SELECT m.name AS manager_name --经理姓名
FROM Employee as m
WHERE m.salary > ALL (
SELECT e.salary
FROM Employee as e
WHERE e.managerId = m.id -- 关联子查询:获取当前经理的所有下属工资
);