**
1、类 Leetcode 题目简介
**
(注:本题是根据Leetcode原题,然后自己新建的一个Employee表。)
编写一个sql查询语句,获取Employee表中第二高的薪水(Salary)。!
**
输出要求
**
例如上述Employee表,使用sql查询语句后应该返回300作为第二高的薪水。
如果不存在第二高的薪水,就返回null。
**
思路解析:
**
首先,当拿到这个题目时你应该想到,既然是要取得排行第二高的薪水,那么第一步我们就先要给整个表格进行排序,这就涉及到第一个方法:
**
order by 排序
**
在MySQL中为我们提供了 order by 的排序方法:
asc:正向排序(从小到大);
desc:反向排序(从大到小)
eg:select * from 表名 order by 字段 + 排序方法;
在进行排序之后,我们就可以知道排行第二高的值到底是谁。
如上图所示,我们可以直观的看到 300 是整个数组中第二大的值,所以接下来的问题就变成如何取得这个值。在MySQL中同样为我们提供了相应的方法。
LIMIT
limit 用于 select 返回指定的记录数,可接受一个或两个参数(参数为常量);
limit n:表示返回最大记录数,检索前 n 个;
limit n,m:第一个参数指返回记录行的偏移量,第二个参数指定返回记录行的最大数目。(解释可能有些晦涩难懂,自己练习下就能明白了)
这时我们已经取得了第二高的薪水,但是我们返回到题目中可以看到,题目要求中写着,当不存在第二高的薪水时,应该返回 null 这个结果,所以我们要使用 ifnull 这个方法先对表进行判断。
ifmull (x,y)
ifnull 函数用于判断第一个表达式是否为 null ,如果为 null 则返回第二个参数;反之,则返回第一个参数。
至此,我们已经得到了第二高的薪水,也对表进行了判断。但是当我们对比输出要求的时候,会发现值上面对应的名称是不合题意的,所以我们还需要对输出结果进行一点小小的加工。
as
给查询的结果取别名,用法:旧字段名 as 新名
至此,我们已经完成了整个题目的解答。
**
补充
**
有的朋友可能会注意到,第一大的值存在2个。在实际开发过程中,我们遇到的数据表不可能会有这么简单的,所以在我们提取这种类型的数据时,需要对重复的数据进行去重操作。对于本题来说,数据过于简单,使用或不使用,关系都不大。
以此题为例,我们使用 distinct 进行去重的操作。
distinct
用于消除重复行
注:当我们进行去重后,相应的 limit 的参数值也要进行相应的改变。