SQL刷题:自连接(Self-Join)--通过将 同一张表连接两次,比较不同行之间的数据关系

例题:

表: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  -- 关联子查询:获取当前经理的所有下属工资
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值