当前位置: 首页 > news >正文

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

相关文章:

  • 在Ubuntu上搭建Samba服务,实现与windows之间的文件共享
  • 如何评价字节发布的集成了AI的IDE trae?和cursor相比,有什么优势和劣势?
  • kan pinn
  • ArcGIS Pro建库中常用公式的应用与技巧
  • 【web前端开发】CSS--CSS简介及其编写位置(上)
  • 【数据结构】堆和priority_queue
  • Python Flask框架学习汇编
  • Android中的Fragment是什么以及它有哪些生命周期方法
  • MySQL : 数据库和表操作
  • 蓝桥与力扣刷题(蓝桥 最大化手工艺品销售利润)
  • 大模型部署TensorRT-LLM保姆级教程(三)- 使用Triton推理服务框架部署模型
  • Js:交换两个变量的值
  • Spring源码分析のAOP
  • 正则表达式梳理(基于python)
  • SPI驱动(二) -- SPI驱动程序模型
  • #UVM# 关于field automation机制中的 pack_bytes 和unpack_bytes 函数剖析
  • SpringBoot为什么默认使用CGLIB?
  • 大型语言模型演变之路:从Transformer到DeepSeek-R1
  • 【量化策略】波动率突破策略
  • 大白话html第十章前沿的网页开发技术
  • 俄乌直接谈判结束
  • 铁路端午假期运输火车票今日开售,12306提升应对超大规模并发访问需求能力
  • 雷军内部演讲回应质疑:在不服输、打不倒方面,没人比我们更有耐心
  • 云南德宏州盈江县发生4.5级地震,震源深度10千米
  • 李峰已任上海青浦区委常委
  • 手机表面细菌菌落总数可能比马桶高10倍,医生详解如何洗手