leecode_CN#176:第二高的薪水

分析

  • 类型:mysql
  • 考察点:去重、排序、筛选、空值判定、别名

176 link

解答:

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
LeetCode是一个在线的编程题库,提供了各种各样的算法和数据结构问题供开发者练习和提编程能力。其中,提到了三个与数组相关的问题。 第一个引用是关于合并两个有序数组的问题,即将两个有序的整数数组合并成一个有序数组。具体的解法可以使用双指针法,分别指向两个数组的末尾,然后比较两个指针指向的元素大小,将较大的元素放入结果数组的末尾,然后将指针向前移动。这个过程重复直到其中一个数组遍历完毕,然后将剩下的元素依次放入结果数组中。 第二个引用是关于移除元素的问题,即移除数组中指定的元素,并返回新数组的长度。可以使用双指针法,左指针维护非指定元素的末尾位置,右指针遍历数组。当右指针指向的元素不等于指定元素时,将右指针指向的元素赋值给左指针指向的位置,然后将左指针和右指针都向前移动一位。直到右指针遍历完整个数组,最后返回左指针的值,即为新数组的长度。 第三个引用也是关于移动零元素的问题,即将数组中的零元素移动到数组末尾,同时保持非零元素的相对顺序不变。可以使用双指针法,左指针维护非零元素的末尾位置,右指针遍历数组。当右指针指向的元素不等于零时,将右指针指向的元素与左指针指向的元素交换位置,然后将左指针和右指针都向前移动一位。直到右指针遍历完整个数组,即完成了零元素的移动。 这些问题都可以使用双指针法解决,利用双指针在数组上进行遍历和操作,实现对数组的操作和处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [LeeCode每日一题–合并两个有序数组](https://download.csdn.net/download/weixin_38645669/14856034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [LeeCode 数组题目](https://blog.csdn.net/weixin_43763903/article/details/114675786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值