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连接查询你真的学会了吗?
Jun 02 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
mysql 数据插入优化方法之concurrent_insert
Jul 01 MySQL
mysql脏页是什么
Jul 26 MySQL
SQL实现LeetCode(197.上升温度)
Aug 07 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
mysql 乱码 字符集latin1转UTF8
Apr 19 MySQL
MySQL中dd::columns表结构转table过程及应用详解
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
mysql时区问题
2008/03/26 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
基于jquery的可多选的下拉列表框
2012/07/20 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
JavaScript实现网页动态生成表格
2020/11/25 Javascript
Python的Django框架使用入门指引
2015/04/15 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python接口测试文件上传实例解析
2020/05/22 Python
python中的测试框架
2020/11/13 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
李维斯牛仔裤英国官方网站:Levi’s英国
2019/10/10 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
应急管理培训方案
2014/06/12 职场文书
活动主持人开场白
2015/05/28 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server