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 07 MySQL
mysql 8.0.24 安装配置方法图文教程
May 12 MySQL
解析MySQL binlog
Jun 11 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
Mysql binlog日志文件过大的解决
Oct 05 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
mysql查找连续出现n次以上的数字
May 11 MySQL
MySql统计函数COUNT的具体使用详解
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
php 中include()与require()的对比
2006/10/09 PHP
PHP读取目录下所有文件的代码
2008/01/07 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
从零学Python之hello world
2014/05/21 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
如何使用Python调整图像大小
2020/09/26 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
清扬洗发水广告词
2014/03/14 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
神秘岛读书笔记
2015/07/01 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python