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 28 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
MYSQL事务的隔离级别与MVCC
May 25 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/11/04 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
python基础教程之字典操作详解
2014/03/25 Python
Django中几种重定向方法
2015/04/28 Python
python中的lambda表达式用法详解
2016/06/22 Python
Python反转序列的方法实例分析
2018/03/21 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python生成器用法实例详解
2019/11/22 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python使用建议与技巧分享(二)
2020/08/17 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
CSS3 分类菜单效果
2019/05/27 HTML / CSS
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
社区志愿者心得体会
2014/01/03 职场文书
小学中秋节活动方案
2014/02/06 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
公司应聘求职信
2014/06/21 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2015高考寄语集锦
2015/02/27 职场文书
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS