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的Seconds_Behind_Master
May 18 MySQL
MySQL注入基础练习
May 30 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
MySQL分库分表详情
Sep 25 MySQL
MySQL数据库超时设置配置的方法实例
Oct 15 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
MySQL分区路径子分区再分区
Apr 13 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 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 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
python pip如何手动安装二进制包
2020/09/30 Python
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
工程业务员工作职责
2013/12/07 职场文书
省三好学生申请材料
2014/01/22 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
会计专业自我评价
2014/02/12 职场文书
出纳担保书范文
2014/04/02 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
北京青年观后感
2015/06/15 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫