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…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...