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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL命令行操作时的编码问题详解
Apr 14 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
MySQL官方导出工具mysqlpump的使用
May 21 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
MySQL数据库超时设置配置的方法实例
Oct 15 MySQL
SQL注入详解及防范方法
Dec 06 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 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
2020最新CPU的性能排名
2020/04/02 数码科技
用PHP+java实现自动新闻滚动窗口
2006/10/09 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
PHP代码优化技巧小结
2015/09/29 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Python3 能振兴 Python的原因分析
2014/11/28 Python
Python字符串切片操作知识详解
2016/03/28 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
市三好学生主要事迹
2014/01/28 职场文书
2014年元旦活动方案
2014/02/15 职场文书
租房协议书怎么写
2014/04/10 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
2014年科研工作总结
2014/12/03 职场文书
灵山大佛导游词
2015/02/04 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书