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与Oracle数据类型对应关系
- mysql8.0查询操作(MySQL 8.0 redo log的深入解析)
- SQL SERVER与MySQL数据类型的对应关系
- mysql底层原理是什么(MySQL 页完全指南—浅入深出页的原理)
- 修改mysql默认超时(MySQL sql_mode修改不生效的原因及解决)
- mysql数据库迁移命令(MySQL数据迁移相关总结)
- 5.6以上版本mysql数据复制(MySQL5.7并行复制原理及实现)
- mysql 操作系统时区(mysql时区查看与设置方法)
- mysql查询逗号分割字符串(MySQL 字符串拆分实例无分隔符的字符串截取)
- 宝塔数据库不小心删了(宝塔面板MySQL数据库经常自动停止的解决方法)
- mysql url连接参数配置(浅谈Mysql连接数据库时host和user的匹配规则)
- mysql 时间戳获取(MySQL时间盲注的五种延时方法实现)
- mysql锁机制及原理(MySQL锁阻塞的深入分析)
- mysqlworkbench怎么设置连接(详解MySQL Workbench使用教程)
- mysql创建数据库教程(MySQL创建数据库并支持中文字符的操作方法)
- mysql索引原理及调优(mysql高级学习之索引的优劣势及规则使用)
- 乔欣首演古装大女主,颜值演技双在线(乔欣首演古装大女主)
- 于正又推女性古装大剧 杨蓉乔欣演女配,两位女主成 重头戏(于正又推女性古装大剧)
- 乔欣古装女主戏获热度 作为女主,却没吃到红利(乔欣古装女主戏获热度)
- 爱情是什么(爱情是什么最经典的话)
- 乔欣 古装剧中的高颜值(古装剧中的高颜值)
- 怎么才可以财富自由(如何让自己实现财富自由)
热门推荐
- dockerswarm使用教程(Docker Swarm集群管理的使用及原理解析)
- amazonawslinux服务器设置(如何在AWS EC2的Linux服务器上开放一个端口)
- php扩展安装示例(php扩展开发入门demo示例)
- python简易版学生管理系统(python3.6实现学生信息管理系统)
- 织梦dedecms开启付费授权(织梦Dedecms设置伪静态详细方法)
- mysql全表查询如何优化(MySQL 分组查询的优化方法)
- phpmysql网站开发入门与提高(PHP+MySQL+sphinx+scws实现全文检索功能详解)
- python简单代码实例(Python实现 版本号对比功能的实例代码)
- SQL SERVER数据库状态
- php图片合成处理(PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9