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 相关文章推荐
教你用eclipse连接mysql数据库
Apr 22 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
MySQL高速缓存启动方法及参数详解(query_cache_size)
Jul 01 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
Mysql排序的特性详情
Nov 01 MySQL
SQL基础查询和LINQ集成化查询
Jan 18 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
mysql 获取时间方式
Mar 20 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 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实现的封装验证码类详解
2013/06/18 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
PHP学习记录之数组函数
2018/06/01 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
django从后台返回html代码的实例
2020/03/11 Python
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
简历的自我评价
2014/02/03 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
行政管理专业求职信
2014/07/06 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
接收函格式
2015/01/30 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
create-react-app开发常用配置教程
2022/06/25 Javascript