mysql order by id查询变慢(MySQL不使用order by实现排名的三种思路总结)
类别:数据库 浏览量:421
时间:2021-09-29 03:43:01 mysql order by id查询变慢
MySQL不使用order by实现排名的三种思路总结假定业务:
查看在职员工的薪资的第二名的员工信息
创建数据库
|
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排名内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://blog.csdn.net/Tinwares/article/details/117425956
您可能感兴趣
- mysql 5.5.27 winx64安装配置方法图文教程(mysql 5.5.27 winx64安装配置方法图文教程)
- mysql建立索引的主要目的(浅谈Mysql哪些字段适合建立索引)
- phpstudymysql数据库启动不了(phpstudy mysql启动不了的解决方法)
- mysql的limit的分页使用(获取 MySQL innodb B+tree 的高度的方法)
- docker查找redis配置文件(解决docker重启redis,mysql数据丢失的问题)
- mysql查看视图注释(详解MySQL的sql_mode查询与设置)
- mysql如何删除外键约束数据(MySQL中外键的创建、约束以及删除)
- mysql中默认排序教程(基于mysql 默认排序规则的坑)
- MySql存储过程
- mysql索引提高效率(MySql如何查看索引并实现优化)
- mysql字段多有什么问题(MySQL编码不一致可能引起的一些问题)
- mysql的三大组件(详解MySQL8的新特性ROLE)
- mysql中的默认mysql数据库作用(MySQL安装后默认自带数据库的作用详解)
- mysql数据库使用规则(mysql数据库基本语法及操作大全)
- mybatis为什么还用mysql(关于MyBatis连接MySql8.0版本的配置问题)
- mysql删除的delete怎么找回(MySQL Delete 删数据后磁盘空间未释放的原因)
- 天空是什么颜色(天空是什么颜色的英语)
- 高马尾扎发(高马尾扎发教程视频)
- 这里输入关键词(请手动输入关键词)
- 小说 顾瑾岚拿出一套飞行棋,别说你连飞行棋都不会哦(顾瑾岚拿出一套飞行棋)
- 金品公司 界界乐中秋限定飞行棋礼盒 露营藤篮礼盒全新上市(界界乐中秋限定飞行棋礼盒)
- 必看 8月,相比七夕,更需要注意的是这些事(必看8月相比七夕)
热门推荐
- css3行内样式表图解(详解css3自定义滚动条样式写法)
- dedecms栏目怎么调用友情链(DedeCms用SQL语句调用数据库任意内容方法)
- dockerspringboot一键部署(docker-compose镜像发布springboot项目的流程分析)
- python中的reload(搞清楚 Python traceback的具体使用方法)
- 看懂云服务器带宽大小的区别(云服务器的流量与带宽是如何换算?)
- python 自定义获取文件目录(Python使用os.listdir和os.walk获取文件路径与文件下所有目录的方法)
- sqlserver 多实例怎么算许可(SQL Server使用row_number分页的实现方法)
- css无效的常见原因
- php分页函数有什么用(php实现分页功能的详细实例方法)
- mysql怎么设置某个字段默认值(MySQL表字段时间设置默认值)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9