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创建高性能索引的全步骤
May 02 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
MySQL 8.0 Online DDL快速加列的相关总结
Jun 02 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
MySQL索引是啥?不懂就问
Jul 21 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
SQL注入详解及防范方法
Dec 06 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
MySQL查询日期时间
May 15 MySQL
MySQL 自动填充 create_time 和 update_time
May 20 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 print类函数使用总结
2010/06/25 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
php实现数字补零的方法总结
2018/09/12 PHP
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
python ElementTree 基本读操作示例
2009/04/09 Python
Python读取mp3中ID3信息的方法
2015/03/05 Python
python 默认参数问题的陷阱
2016/02/29 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python构建网页爬虫原理分析
2017/12/19 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
在线课程:Skillshare
2019/04/02 全球购物
护理专业毕业生推荐信
2013/10/31 职场文书
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
春风化雨观后感
2015/06/11 职场文书
换届选举主持词
2015/07/03 职场文书
公司行政管理制度范本
2015/08/05 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
Linux下搭建SFTP服务器的命令详解
2022/06/25 Servers