48 - 第二高的薪水
题目
Create table If Not Exists Employee (Id int, Salary int)
Truncate table Employee
insert into Employee (Id, Salary) values ('1', '100')
insert into Employee (Id, Salary) values ('2', '200')
insert into Employee (Id, Salary) values ('3', '300')
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
+---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
解答
mycli里面,摁f3可以换行。f4进入vim模式,比如摁o来新建下一行
创建表时不能同时往里面塞数据,似乎只能一行行insert。
而且insert必须加括号
select
(select distinct salary from employee order by `Salary` desc limit 1,1)
as SecondHighestSalary
Runtime: 140 ms, faster than 62.65% of MySQL online submissions forSecond Highest Salary.
Memory Usage: N/A
distinct
,说明选择的是不同的内容。比如两个人的salary是一样的,那么只会显示一条工资。order by … desc
,说明是降序排列limit 1, 1
,相当于limit 1 offset 1
。limit
是一条一分页,offset
是偏移量,也就是打印第2页(第一页是0,因为离第一页的偏移为0)不过这第一个参数是
offset
,第二个参数是limit
。也就是第一个1是偏移量,第二个1是展示数量。而且分开写还不能把offset
放在前面。。。似乎还是写开了,比较容易理解。
as
,是别名,选出来的数据,列名叫什么。as
可以不写,不过还是觉得写着跟容易理解
整个命令的做法是,先把括号里面的东西选出来,选出来的是一个临时表 。然后再选中这个临时表,选出来的再命别名。
select
ifnull (
(select distinct salary from employee order by `Salary` desc limit 1,1),
null
)
as SecondHighestSalary
Runtime: 153 ms, faster than 43.52% of MySQL online submissions forSecond Highest Salary.
Memory Usage: N/A
这里加了一句ifnull
的判断,如果第一个参数是null
就令其为第二个参数。在此是如果找不到值,就令其为null
select max(salary) as SecondHighestSalary
from employee
where `Salary` <> (select max(`Salary`) from employee)
Runtime: 191 ms, faster than 5.54% of MySQL online submissions forSecond Highest Salary.
Memory Usage: N/A
这里多做了一步挑选max
的操作,所以很费时间
Last updated
Was this helpful?