MySQL两表联查之分组成绩第几问题
MySQL 数据库操作实践:两表联查之分组成绩第几问题
在本篇博客中,我将展示MySQL 从创建表、到插入数据,并进行一些复杂的查询操作。
1. 建立表格
首先,我们创建两个表:department(部门)和 employee(员工)。
CREATE TABLE department (id INT PRIMARY KEY,name VARCHAR(50)
);CREATE TABLE employee (id INT PRIMARY KEY,name VARCHAR(50),department_id INT,salary DECIMAL(10, 2)
);
2.插入数据
接下来,让我们向这两个表中插入一些数据:
-- 部门表数据插入
INSERT INTO department (id, name) VALUES
(1, 'HR'),
(2, 'Finance');-- 员工表数据插入
INSERT INTO employee (id, name, department_id, salary) VALUES
(1, 'Amy', 1, 8000.00),
(2, 'Ben', 2, 9000.00),
(3, 'Charlie', 1, 8500.00),
(4, 'Diana', 2, 8200.00),
(5, 'Eric', 1, 8300.00),
(6, 'Fiona', 2, 8700.00);
3.查询问题
问题1:查询每个部门中工资最高的员工姓名及其工资
SELECT d.name AS department_name, e.name AS employee_name, e.salary AS max_salary
FROM department d
JOIN employee e ON d.id = e.department_id
WHERE (e.department_id, e.salary) IN (SELECT department_id, MAX(salary) FROM employee GROUP BY department_id);
SQL解释:
子查询:(SELECT department_id, MAX(salary) FROM employee GROUP BY department_id)
这个子查询用于找出每个部门中工资最高的员工的工资。
主查询中的关联和过滤条件:SELECT d.name AS department_name, e.name AS employee_name, e.salary AS max_salary
通过将主查询中员工所在部门和工资与子查询的结果进行比对,找到符合条件的员工,并返回他们的部门名称、姓名和最高工资。
这样的查询结构使我们能够有效地找到每个部门中工资最高的员工,并展示他们的相关信息。
问题2:查询每个部门中工资排名第2高的员工姓名及其工资
SELECT d.name AS department_name, e.name AS employee_name, e.salary AS second_highest_salary
FROM department d
JOIN employee e ON d.id = e.department_id
WHERE (e.department_id, e.salary) IN (SELECT department_id, MAX(salary) FROM employee WHERE salary < (SELECT MAX(salary) FROM employee e2 WHERE e.department_id = e2.department_id) GROUP BY department_id);
SQL解释:
子查询1:SELECT MAX(salary) FROM employee e2 WHERE e.department_id = e2.department_id
这个子查询用于找出每个部门中工资最高的员工的工资。
子查询2:SELECT department_id, MAX(salary) FROM employee WHERE salary < (Subquery1) GROUP BY department_id
这个子查询根据第一个子查询的结果,找出每个部门中工资排名第二高的员工的工资。它首先去除了最高工资,然后再取出次高的工资。
主查询中过滤条件:WHERE (e.department_id, e.salary) IN (Subquery2)
通过将主查询中员工所在部门和工资与第二个子查询的结果进行比对,找到符合条件的员工,并返回他们的部门名称、姓名和次高工资。
这样的嵌套查询结构使得我们能够在不引入额外的复杂逻辑的情况下,完成对每个部门中工资排名第二高的员工的查询。
问题3:查询每个部门中工资排名第3高的员工姓名及其工资
SELECT d.name AS department_name, e.name AS employee_name, e.salary AS third_highest_salary
FROM department d
JOIN employee e ON d.id = e.department_id
WHERE (e.department_id, e.salary) IN (SELECT department_id, MAX(salary) FROM employee WHERE salary < (SELECT MAX(salary) FROM employee e2 WHERE e.department_id = e2.department_id) AND salary NOT IN (SELECT MAX(salary) FROM employee e3 WHERE e.department_id = e3.department_id) GROUP BY department_id);
SQL解释及修改说明:
子查询2修改:
在原来的第二个子查询中,增加了一个 AND salary NOT IN 条件,以排除掉最高和次高的工资,从而获取到第三高的工资。
主查询中过滤条件:
通过将主查询中员工所在部门和工资与修改后的第二个子查询的结果进行比对,找到符合条件的员工,并返回他们的部门名称、姓名和第三高工资。
这样修改后的查询语句应该能够准确地查询出每个部门中工资排名第3高的员工姓名及其工资。
问题4:查询每个部门中工资排名第4高的员工姓名及其工资
SELECT d.name AS department_name, e.name AS employee_name, e.salary AS fourth_highest_salary
FROM department d
JOIN employee e ON d.id = e.department_id
WHERE (e.department_id, e.salary) IN (SELECT department_id, MAX(salary) FROM employee WHERE salary < (SELECT MAX(salary) FROM employee e2 WHERE e.department_id = e2.department_id) AND salary NOT IN (SELECT MAX(salary) FROM employee e3 WHERE e.department_id = e3.department_id) AND salary NOT IN (SELECT MAX(salary) FROM employee e4 WHERE e.department_id = e4.department_id) GROUP BY department_id);
SQL解释及修改说明:
子查询2修改:
在原来的第二个子查询中,增加了一个 AND salary NOT IN 条件,以排除掉最高、次高和第三高的工资,从而获取到第四高的工资。
相信通过以上步骤,你已经感受到了类似题目中的规律,希望对你有所帮助!
相关文章:
MySQL两表联查之分组成绩第几问题
MySQL 数据库操作实践:两表联查之分组成绩第几问题 在本篇博客中,我将展示MySQL 从创建表、到插入数据,并进行一些复杂的查询操作。 1. 建立表格 首先,我们创建两个表:department(部门)和 em…...
每日一题(leetcode2952):添加硬币最小数量 初识贪心算法
这道题如果整体去思考,情况会比较复杂。因此我们考虑使用贪心算法。 1 我们可以假定一个X,认为[1,X-1]区间的金额都可以取到,不断去扩张X直到大于target。(这里为什么要用[1,X-1]而不是[1,X],总的来说是方便,潜在思想…...
[Errno 2] No such file or directory: ‘g++‘
报错解释: 这个错误表明系统试图访问名为g++的文件或目录,但没有找到。g++是GNU编译器集合(GNU Compiler Collection)中的C++编译器。如果系统中没有安装g++或者g++不在环境变量的路径中,就会出现这个错误。 解决方法: 确认g++是否已安装: 在Linux上,可以尝试运行g+…...
go的通信Channel
一、channel是什么 1.一种通信机制 channel是goroutine与goroutine之间数据通信的一种通信机制。一般都是2个g及以上一起工作。 channel与关键字range和select紧密相关。 二、channel的结构 go源码:GitHub - golang/go: The Go programming language src/runt…...
手写红黑树【数据结构】
手写红黑树【数据结构】 前言版权推荐手写红黑树一、理论知识红黑树的特征增加删除 二、手写代码初始-树结点初始-红黑树初始-遍历初始-判断红黑树是否有效查找增加-1.父为黑,直接插入增加-2. 父叔为红,颜色调换增加-3. 父红叔黑,颜色调换&am…...
[蓝桥杯练习]通电
kruskal做法(加边) #include <bits/stdc.h> using namespace std; int x[10005],y[10005],z[10005];//存储i点的x与y坐标 int bcj[10005];//并查集 struct Edge{//边 int v1,v2; double w; }edge[2000005]; int cmp(Edge a, Edge b){return a.w < b.w;} int find(i…...
安全算法 - 摘要算法
摘要算法是一种将任意长度的数据转换为固定长度字节串的算法。它具有以下特点和应用。 首先,摘要算法能够生成一个唯一且固定长度的摘要值,用于验证数据的完整性和一致性。无论输入数据有多长,生成的摘要值始终是固定长度的,且即…...
操作系统:动静态库
目录 1.动静态库 1.1.如何制作一个库 1.2.静态库的使用和管理 1.3.安装和使用库 1.4.动态库 1.4.1.动态库的实现 1.4.2.动态库与静态库的区别 1.4.3.共享动态库给系统的方法 2.动态链接 2.1.操作系统层面的动态链接 1.动静态库 静态库(.a)&…...
车载电子电器架构 —— 局部网络管理汇总
车载电子电器架构 —— 局部网络管理汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…...
网络安全 | 什么是DDoS攻击?
关注WX:CodingTechWork DDoS-介绍 DoS:Denial of Service,拒绝服务。DDoS是通过大规模的网络流量使得正常流量不能访问受害者目标,是一种压垮性的网络攻击,而不是一种入侵手段。NTP网络时间协议,设备需要…...
[Godot] 3D拾取
CollisionObject3D文档 Camera3D文档 CollisionObject3D有个信号_input_event,可以用于处理3D拾取。 Camera3D也有project_position用于将屏幕空间坐标投影到3D空间。 extends Node3D#是否处于选中状态 var selected : bool false #摄像机的前向量 var front : V…...
知识融合:知识图谱构建的关键技术
目录 一、引言二、知识图谱基础2.1 知识表示三元组属性图 2.2 知识抽取实体抽取关系抽取属性抽取 三、知识融合的核心问题3.1 实体识别与链接实体识别实体链接 3.2 重复实体合并方法示例 3.3 关系融合挑战方法示例 四、知识融合技术深度解析4.1 基于规则的方法规则设计原则规则…...
外贸建站:WordPress搭建外贸独立站零基础自建站完整教程(2024)
对于做外贸来说,拥有自己的外贸独立网站真的非常重要。在外贸领域,如今各平台竞争激烈,规则多,成本高,价格战、政策变化快,还存在封店风险等等因素。在这种情况下,拥有外贸独立站就能很好规避上…...
【教程】Kotlin语言学习笔记(五)——Lambda表达式与条件控制
写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 第五章 《L…...
C++的并发世界(三)——线程对象生命周期
0.案例代码 先看下面一个例子: #include <iostream> #include <thread>void ThreadMain() {std::cout << "begin sub thread:" << std::this_thread::get_id()<<std::endl;for (int i 0; i < 10; i){std::cout <&…...
SAD法(附python实现)和Siamese神经网络计算图像的视差图
1 视差图 视差图:以左视图视差图为例,在像素位置p的视差值等于该像素在右图上的匹配点的列坐标减去其在左图上的列坐标 视差图和深度图: z f b d z \frac{fb}{d} zdfb 其中 d d d 是视差, f f f 是焦距, b b…...
基于DWT(离散小波变换)的图像加密水印算法,Matlab实现
博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…...
【威胁情报综述阅读3】Cyber Threat Intelligence Mining for Proactive Cybersecurity Defense
【威胁情报综述阅读1】Cyber Threat Intelligence Mining for Proactive Cybersecurity Defense: A Survey and New Perspectives 写在最前面一、介绍二、网络威胁情报挖掘方法和分类A. 研究方法1) 第 1 步 - 网络场景分析:2) 第 2 步 - 数据…...
在编程中使用中文到底该不该??
看到知乎上有个热门问题,为什么很多人反对中文在编程中的使用? 这个问题有几百万的浏览热度,其中排名第一的回答非常简洁,我深以为然: 在国内做开发,用中文写注释、写文档,是非常好的习惯&…...
PyQt6从入门到放弃
PyQt6从入门到放弃 安装PyQt6 pip install PyQt6# 查看QT和PyQT的版本 from PyQt6.QtCore import QT_VERSION_STR from PyQt6.QtCore import PYQT_VERSION_STR print(QT_VERSION_STR) print(PYQT_VERSION_STR)PyQt6模块 PyQt6类由一系列模块组成包括QtCore、QtGui、QtWidgets…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
