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 - 常用函数 每天积极向上
Apr 05 MySQL
MySQL 存储过程的优缺点分析
May 20 MySQL
MySQL官方导出工具mysqlpump的使用
May 21 MySQL
Mysql 用户权限管理实现
May 25 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
SQL注入的实现以及防范示例详解
Jun 02 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
mysql函数之截取字符串的实现
Aug 14 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
动易数据转成dedecms的php程序
2007/04/07 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
php身份证号码检查类实例
2015/06/18 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
javascript引用对象的方法
2007/01/11 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
js实现抽奖效果
2017/03/27 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
javascript操作元素的常见方法小结
2019/11/13 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
python使用多线程不断刷新网页的方法
2015/03/31 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
如何提高SQL Server的安全性
2016/07/25 面试题
研究生求职推荐信范文
2013/11/30 职场文书
工作决心书
2014/03/11 职场文书
科学发展观演讲稿
2014/09/11 职场文书