分析
- 类型:mysql
- 考察点:去重、排序、筛选、空值判定、别名
解答:
123 ms
select IFNULL(
(select DISTINCT Salary from Employee order by Salary DESC limit 1,1), NULL) AS SecondHighestSalary
110ms
select IFNULL((select DISTINCT Salary from Employee order by Salary DESC limit 1 offset 1), NULL) AS SecondHighestSalary
106ms
select (select DISTINCT Salary from Employee order by Salary DESC limit 1 offset 1) AS SecondHighestSalary
112ms
select (select DISTINCT Salary from Employee order by Salary DESC limit 1, 1) AS SecondHighestSalary
综上,ifnull相对耗时,offset更优
-
坑1:空值问题
注意写法:
1.子查询 2 IFNULL(*, NULL)
测试数据:
{“headers”: {“Employee”: [“Id”, “Salary”]}, “rows”: {“Employee”: [[1, 100]]}} -
坑2:去重
distinct
{“headers”: {“Employee”: [“Id”, “Salary”]}, “rows”: {“Employee”: [[1, 100],[2, 100]]}}
扩展1:
- mysql 二者语法区别:
- limit 2,1 从第二条开始,取一条数据
- LIMIT 2 OFFSET 1 从第一条开始,取2条数据
思考:
网上查资料时,看到一篇文章,觉得很有意思。
内容大概是比较下边2个sql的耗时问题,先讲一下结论==>当rows比较大是,第二种写法比第一种快几倍。
mysql> select * from test where val=4 limit 300000,5;
mysql> select * from test a inner join (select id from test where val=4 limit 300000,5) b on a.id=b.id;
我们看一下这位博主的结论
预测结果是运行select * from test a inner join (select id from test where val=4 limit 300000,5) b on a.id=b.id;之后,buffer pool中的数据页的数量远远少于select * from test where val=4 limit 300000,5;对应的数量,因为前一个sql只访问5次数据页,而后一个sql访问300005次数据页。
我认为结论少了一些东西,比如内关联查询同样使用了limit 300000,5查询ID,理论上应该遇到和方案1一样的查询300000数据页问题。
我的猜测是对sql执行,有优先级筛选。详情不明,待后续知晓后,补充。
扩展2
LIMIT 1问题
- 结论1,在无索引情况下,limit 1比不加,更快
- 结论2,在有索引情况下,二者区别不大
参考资料:
- https://www.cnblogs.com/cnmenglang/p/5533580.html
- https://www.cnblogs.com/zhangyachen/p/8030252.html
- https://blog.csdn.net/qq_38836118/article/details/88181324