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

ops/2025/3/10 4:39:42/

例题:

表: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 筛选出工资高于经理的员工。

代码:

sql">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
需求统计每个经理(有下属的员工)管理的下属人数,返回经理姓名及下属数量,按人数降序排列。

sql">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
需求找出哪些经理的下属中至少有一人的工资比自己高,返回这些经理的姓名及其下属的最高工资。

sql">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
需求找出工资高于其所有下属的经理,返回经理姓名。

sql">SELECT m.name AS manager_name --经理姓名
FROM Employee as m
WHERE m.salary > ALL (SELECT e.salaryFROM Employee as eWHERE e.managerId = m.id  -- 关联子查询:获取当前经理的所有下属工资
);


http://www.ppmy.cn/ops/164563.html

相关文章

Uniapp打包H5端弱网络环境下存在页面UI渲染错乱问题方案实现

一.需求 uniapp打包的H5项目,首页模块的业务逻辑偏多,调用的接口数量庞大,在弱网络的情况下切换了页面或者网络较好但是页面的UI未渲染完成的情况下快速地切换了页面会出现UI渲染错乱的问题,针对该问题个人从两个方面来进行处理&…

美颜SDK架构揭秘:人脸美型API的底层实现与优化策略

在短视频、直播和社交娱乐行业的快速发展下,美颜SDK已成为各大应用的重要组成部分。其中,人脸美型API作为核心功能,决定了最终的美颜效果和用户体验。本文将深入探讨美颜SDK的人脸美型API的底层实现,并分享优化策略,帮…

【Linux网络】NAT技术、DNS系统、五种IO模型

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、NAT2、代理服务器3、内网穿透4、DNS 和 ICMP5、五种IO模型 1、NAT NAT (网络地址转换)技术主要解决 I…

嵌入式学习笔记-卡尔曼滤波,PID,MicroPython

文章目录 卡尔曼滤波卡尔曼滤波的核心思想卡尔曼滤波的数学模型1. 状态转移模型(预测系统状态)2. 观测模型(预测测量值) 卡尔曼滤波的五个关键步骤1. 预测状态2. 预测误差协方差3. 计算卡尔曼增益4. 更新状态5. 更新误差协方差 卡…

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…

godot在_process()函数实现非阻塞延时触发逻辑

extends Node2D# 用于累加 delta 的变量 var elapsed_time 0 # 设定计时周期,单位为秒 var interval 3func _process(delta):# 累加 delta 到 elapsed_timeelapsed_time delta# 检查是否达到了设定的时间间隔if elapsed_time > interval:# 执行每 3 秒要做的逻…

rabbitmq-amqp事务消息+消费失败重试机制+prefetch限流

1. 安装和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

【每日学点HarmonyOS Next知识】Web跨域资源、Web长按菜单、Web拦截请求、禁止录屏、Base64图片宽高

1、HarmonyOS Web组件本地资源跨域问题&#xff1f; 关于资源跨域问题的解决&#xff0c;可以参考以下官网文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/web-cross-origin-V5 方法一 为了使Web组件能够成功访问跨域资源&#xff0c;开…