题解和SQL优化!
查找入职员工时间排名倒数第三的员工所有信息
http://www.nowcoder.com/practice/ec1ca44c62c14ceb990c3c40def1ec6c
题意
给你一张员工信息表,请查询出其中入职时间上倒数第三的员工
思路
- 因为同一个入职时间可能存在多个员工,所以我们需要先获取倒数第三入职对应的时间,我们同样根据hire_date字段进行排序分页即可,SQL如下
SQL1:
SELECT
hire_date
FROM employees
GROUP BY hire_date
ORDER BY hire_date DESC
LIMIT 1 OFFSET 2
- 最后只需要查询出所有匹配该日期的记录即可(注意结果去重),最终SQL如下
SELECT
emp_no,
birth_date,
first_name,
last_name,
gender,
hire_date
FROM
employees
WHERE hire_date = (
SQL1
)
优化:
- 首先使用EXPLAIN查看执行计划,发现子查询和外部查询都使用全表扫描,没有用到索引
- 且子查询需要使用临时表和文件排序
- 再查看JSON格式,发现开销为3.20
- 根据执行计划,我们的想办法将文件排序去除,从SQL上看,排序针对的是hire_date字段,所以我们只需要在该字段上建立索引即可
- 此时再查看执行计划,发现文件排序和临时表都消失了
- 再查看开销,此时降为了1.20!
MySQL练习 文章被收录于专栏
解析牛客网中的SQL题目