Bootstrap

SQL使用(一):如何使用SQL语句去查询第二高的值

今天刷MYSQL题的时候刷到这样一个题:


 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

 +----+--------+
 | Id | Salary |
 +----+--------+
 | 1  | 100    |
 | 2  | 200    |
 | 3  | 300    |
 +----+--------+
 例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

 +---------------------+
 | SecondHighestSalary |
 +---------------------+
 | 200                 |
 +---------------------+

初看了一眼题时,脑子还有一点迷糊,对于数值最大的和最小的,可以使用max和min去查询出来,但对于第N的就不好找了,思考了一会儿了,心里大致有二个思路:

第一个思路,因为是求的第二高,那就把最高的找出来,小于的它的,然后再排列一下取最大的就行了


# 1、求最大的值
select max(Salary)
from Employee;
# 2、求小于最大的值
select max(Salary) as SecondHighestSalary
from Employee
where Salary < (select max(Salary) from Employee);

第二个思路,先将所有值倒序排,然后输出第二个就行


select Salary as SecondHighestSalary
from Employee
order by Salary desc
limit 1,1;
#若是有相同的值,只输出一个,所以加上distinct
select distinct Salary as SecondHighestSalary
from Employee
order by Salary desc
limit 1,1;

然后去执行语句的时候,发现与预期结果相同,心里窃喜,这就算出来了。。。


输入:
 {"headers": {"Employee": ["Id", "Salary"]}, "rows": {"Employee": [[1, 100], [2, 200], [3, 300]]}}
 输出:
 {"headers": ["Salary"], "values": [[200]]}
预期结果:
 {"headers": ["SecondHighestSalary"], "values": [[200]]}

随着去提交代码之后,返回的结果却是 解答错误,满头的黑人问号脸,哪里错了?怎么错了的?

查看错误详情:


 输入:
{"headers": {"Employee": ["Id", "Salary"]}, "rows": {"Employee": [[1, 100]]}}
输出:
{"headers": ["SecondHighestSalary"], "values": []}
预期:
{"headers":["SecondHighestSalary"],"values":[[null]]}

恍然大悟,原来是没有考虑”如果不存在第二高的薪水,那么查询应返回 null“这个情况,找到问题就好办了,这也是我们在代码中写sql时常没有考虑到异常情况。

如果查询不到数据,应该返回什么值,需不需对这种情况进行封装的考虑,这道题里已经要求了,若是没有查询到就输出null,所以再次修改了我的sql:

select ifnull(
                   (select Salary from Employee order by Salary desc limit 1,1), null) as SecondHighestSalary;

结果:顺利通过在这里插入图片描述
这道题主要考察的知识点就是LIMIT的使用和对NULL的处理,之前写过一篇与LIMIT有关的文章,LIMIT在实际使用过程使用情况非常普遍。

知识点总结:

LIMIT

LIMIT 一般都是放在SQL语句的最后,是对展示的结果做一个限制输出,比如查询了十条记录,但只展示一条,那就可以在SQL语句后面加一个LIMIT 1。

LIMIT 语法:


SELECT column_list
FROM table1
ORDER BY column_list
LIMIT row_count OFFSET offset_count;
# row_count 表示 返回的记录数
# offset为偏移量,表示从哪条数据开始返回,使用过程中也可以省略

举例:

1、查询出雇员表中的5条记录

select * from Employee limit 5;

2、查询出雇员表第二条数据后的5条记录(不包括第二条数据)

#不显示最前面二条数据,从第三条数据开始展示
select * from Employee 5 offset 2;
==
select * from Employee 2,5;-->这是我最喜欢使用的写法

IFNULL()

IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
菜鸟教程
IFNULL()语法:

IFNULL(expression, alt_value)

举例:

select ifnull("111","展示我" );

输出结果:
在这里插入图片描述
如果SQL语句是这样写的:

select ifnull(null,"展示我" );

输出结果:

在这里插入图片描述
上面内容就是这个题想要考察的知识点,其实这些知识点都知道,但在写SQL语句的时候就没有这个意识去考虑异常情况的处理,就像我们经常设计测试用例的时候需要特别对异常场景的考虑,是因为程序最容易出错的地方就是对异常情况的处理,若是不处理那就是一个bug,也许这个bug当时没有体现,但久了就一定会暴露出来。

如果在设计用例或写代码时没有这个思维,那就多练多写,让自己有意识地去考虑异常情况。

最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几天时间整理的非常全面的,希望也能帮助到有需要的你!

在这里插入图片描述

这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

点击文末小卡片领取

敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。

自学推荐B站视频:

零基础转行软件测试:自学完软件测试,拿到了字节的测试岗offer,堪称B站最好的视频!

自动化测试进阶:已上岸华为,涨薪20K,2022最适合自学的python自动化测试教程,自己花16800买的,无偿分享

;