MySQL不使用order by实现排名的三种思路总结
作者:CodePhage 发布时间:2024-01-17 13:43:46
标签:mysql,orderby
假定业务:
查看在职员工的薪资的第二名的员工信息
创建数据库
drop database if exists emps;
create database emps;
use emps;
create table employees(
empId int primary key,-- 员工编号
gender char(1) NOT NULL, -- 员工性别
hire_date date NOT NULL -- 员工入职时间
);
create table salaries(
empId int primary key,
salary double -- 员工薪资
);
INSERT INTO employees VALUES(10001,'M','1986-06-26');
INSERT INTO employees VALUES(10002,'F','1985-11-21');
INSERT INTO employees VALUES(10003,'M','1986-08-28');
INSERT INTO employees VALUES(10004,'M','1986-12-01');
INSERT INTO salaries VALUES(10001,88958);
INSERT INTO salaries VALUES(10002,72527);
INSERT INTO salaries VALUES(10003,43311);
INSERT INTO salaries VALUES(10004,74057);
题解思路
1、(基础解法)
先查出salaries表中最高薪资,再以此为条件查出第二高的工资
查询语句如下:
select
E.empId,E.gender,E.hire_date,S.salary
from
employees E join salaries S
on
E.empId = S.empId
where
S.salary=
(
select max(salary)from salaries
where
salary<
(select max(salary) from salaries)
);
-- ---------------查询结果------------ --
+-------+--------+------------+--------+
| empId | gender | hire_date | salary |
+-------+--------+------------+--------+
| 10004 | M | 1986-12-01 | 74057 |
+-------+--------+------------+--------+
2、(自联结查询)
先对salaries进行自联结查询,当s1<=s2链接并以s1.salary分组,此时count的值,即薪资比他高的人数,用having筛选count=2 的人,就可以得到第二高的薪资了;
查询语句如下:
select
E.empId,E.gender,E.hire_date,S.salary
from
employees E join salaries S
on
E.empId = S.empId
where S.salary=
(
select
s1.salary
from
salaries s1 join salaries s2
on
s1.salary <= s2.salary
group by
s1.salary
having
count(distinct s2.salary) = 2
);
-- ---------------查询结果------------ --
+-------+--------+------------+--------+
| empId | gender | hire_date | salary |
+-------+--------+------------+--------+
| 10004 | M | 1986-12-01 | 74057 |
+-------+--------+------------+--------+
3、(自联结查询优化版)
原理和2相同,但是代码精简了很多,上面两种是为了引出最后这种方法,在很多时候group by和order by都有其局限性,对于俺们初学者掌握这种实用性较广的思路,还是很有意义的。
select
E.empId,E.gender,E.hire_date,S.salary
from
employees E join salaries S
on
S.empId =E.empId
where
(select count(1) from salaries where salary>=S.salary)=2;
-- ---------------查询结果------------ --
+-------+--------+------------+--------+
| empId | gender | hire_date | salary |
+-------+--------+------------+--------+
| 10004 | M | 1986-12-01 | 74057 |
+-------+--------+------------+--------+
初浅总结,如有错误,还望指正。
来源:https://blog.csdn.net/Tinwares/article/details/117425956
0
投稿
猜你喜欢
- 导入所需库%matplotlib inlineimport sympyimport numpy as npimport matplotlib
- 今天下午在练习python时用了“if...if...else...”的分支结构,结果运行出来吓我一跳。原来我想当然的认为“if...if.
- Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下
- 一、 简介1、 基本介绍Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色
- Logminer是每个Dba都应熟悉的工具,当一天由于用户的误操作你需要做不完全的恢复时,由于你无法确定这个操作是哪个时间做的,所以这对你的
- 如下所示:def trans_data_to_pair(self,data,index): contents=[
- 简介HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式。服务端通过是根据请求头中的Content-
- 问题:想装tfx,但是提示不支持python3.9。解决方案:新建一个环境tfx专门用来运行流水线,这个环境安装python3.8。1.查看
- 内容摘要:这篇文章的主旨是弄清楚如何根据实际需求实现一个联动菜单以及联动菜单的原理,实例是实现一个日期选择下拉菜单。首先来分析一下日期下拉菜
- 如果使用Python做大型海量数据批量任务时,并且backend用mongodb做数据储存时,常常面临大量读写数据库的情况。尤其是大量更新任
- 查看当前数据库支持的引擎show engines+--------------------+---------+--------------
- 如下所示:#!/usr/bin/python2.6 # -*- coding: utf-8 -*- import time cl
- 今天发现个好东西啊,叫片刻抠图,是一个在线对图片自动抠图去除背景的网站。只要上传图片,就可以自动把背景去掉把目标对象抠出来。不管是动物、汽车
- 本文实例讲述了Python3中正则模块re.compile、re.match及re.search函数用法。分享给大家供大家参考,具体如下:r
- 其实 selenium启动窗口的时候就是 使用了subprocess.Popen 启动的驱动程序的,只要在启动的时候加上启动不显示窗口的参数
- Django是一种基于Python的Web开发框架一、在命令行中创建Django项目(Windows平台、python3.6)1、建立虚拟环
- 仪表盘仪表盘的效果我只能说炫酷而已,如果想要运用在实际的场景中,我其实也不清楚那个场景比较适合,但是pyecharts毕竟是炫酷可视化的利器
- 大家都知道很多控件是没有clicked信号的,我在网上找了很多终于总结出2个方法来实现类似需求,比如给QLineEdit添加clicked信
- 下面就是我们的authenticate.asp页面,在这里,将用户的信息收集起来,连同最初的URL一起传到一个识别用户身份的页面中。我们可用
- 利用MySQLfs这个工具,我么可以在MySQL关系数据库中存储文件系统。MySQLfs将文件系统中文件的字节内容分解成数据库中的元组,而数