MySQL不使用order by实现排名的三种思路总结


Posted in MySQL onJune 02, 2021

假定业务:

查看在职员工的薪资的第二名的员工信息

创建数据库

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 |
+-------+--------+------------+--------+

初浅总结,如有错误,还望指正。

总结

到此这篇关于MySQL不使用order by实现排名的三种思路的文章就介绍到这了,更多相关MySQL不用order by排名内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql对于模糊查询like的一些汇总
May 09 MySQL
详解MySQL连接挂死的原因
May 18 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
MySQL Server 层四个日志
Mar 31 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
MYSQL事务的隔离级别与MVCC
May 25 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 MySQL
Mysql的Table doesn't exist问题及解决
Dec 24 MySQL
MySQL连接查询你真的学会了吗?
Jun 02 #MySQL
SQL注入的实现以及防范示例详解
Jun 02 #MySQL
如何自己动手写SQL执行引擎
MySQL 8.0 Online DDL快速加列的相关总结
MySQL 常见存储引擎的优劣
Jun 02 #MySQL
Mysql文件存储图文详解
一文读懂navicat for mysql基础知识
You might like
深入PHP与浏览器缓存的分析
2013/06/03 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
JS小框架 fly javascript framework
2009/11/26 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
Python 可爱的大小写
2008/09/06 Python
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
国庆促销活动总结
2014/08/29 职场文书
就业意向书范本
2015/05/11 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python