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入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
MySQL infobright的安装步骤
Apr 07 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
浅谈MySQL next-key lock 加锁范围
Jun 07 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
Mysql排序的特性详情
Nov 01 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL下载安装配置详细教程 附下载资源
Sep 23 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
缅甸的咖啡简史
2021/03/04 咖啡文化
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
使用Python的PEAK来适配协议的教程
2015/04/14 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
最热门的自我评价
2013/12/30 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python