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
您可能感兴趣
- mysqlexplain的用法(MySQL SHOW STATUS语句的使用)
- MYSQL中常用的强制性操作
- mysql从入门到实践万字详解(mysql基础知识扫盲)
- mysql锁技术(MySQL 加锁控制并发的方法)
- mysql为什么优选innodb(如何区分MySQL的innodb_flush_log_at_trx_commit和sync_binlog)
- mysql修改初始密码教程(使用MySQL命令行修改密码)
- 对mysql索引的理解(详解MySQL 8.0 之不可见索引)
- mysql快速添加百万条记录(Mysql快速插入千万条数据的实战教程)
- mysql not exists用法(mysql中EXISTS和IN的使用方法比较)
- mysql url连接参数配置(浅谈Mysql连接数据库时host和user的匹配规则)
- mysql的常见优化(详解GaussDB for MySQL性能优化)
- mysql有哪些索引和聚簇索引(MySQL 独立索引和联合索引的选择)
- navicat怎么和mysql连接(Navicat Premium远程连接MySQL数据库的方法)
- 阿里云ecs服务器数据在哪儿(阿里云ECS云服务器linux系统安装mysql后远程连接不了踩坑)
- mysql中group_concat
- mysql数据库事务处理(MySQL数据库事务与锁深入分析)
- 红色文化进国企(红色文化进国企)
- 车友的选择| 轮毂该如何选(车友的选择轮毂该如何选)
- 秦海璐炫耀和王新军热恋蜜事,不料对方吐槽她吃饱后肚子撅老高(秦海璐炫耀和王新军热恋蜜事)
- 秦海璐一袭旗袍惹人倾心,将高级与淡雅展现的游刃有余(秦海璐一袭旗袍惹人倾心)
- 门外之见 海蛎子味 的表演,能走多远(门外之见海蛎子味)
- 三部冷门谍战剧,第一部2014年拍摄,至今还未播出(三部冷门谍战剧)
热门推荐
- angularjs数据绑定类指令及作用(详解Angular数据绑定及其实现方式)
- python装饰器怎么设置(深入了解和应用Python 装饰器 @decorator)
- druid数据库连接池原理详解(阿里巴巴Druid,轻松实现MySQL数据库加密!)
- docker集群安装教程(使用docker部署hadoop集群的详细教程)
- sqlserver存储过程怎么写日志(SqlServer快速检索某个字段在哪些存储过程中sql 语句)
- asp.net网站如何优化
- .NET中pdb文件的作用
- 多个tomcat实例配置文件(tomcat单机多实例的实现)
- php怎么根据字符串长度设置(php常用字符串长度函数strlen与mb_strlen用法实例分析)
- css3字体怎么设置(使用CSS3 font-feature-settings特性减除字体动画震颤效果)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9