第二高的薪水
我第一次尝试:
SELECT salary AS SecondHighestSalary
FROM Employee
ORDER BY salary DESC
LIMIT 1,1
根据salary降序,然后取第二个,但是这有一个问题,就是如果数据少于两个,就会报错
错误显示,当表中数据只有一条时,返回了[],预期是得到[null]
意思是,如果没有第二高的薪水,应该给返回一条数据,这条数据是null
但是我的方法返回了0条数据。所以算我不对。
对于这个问题,DataGrip和Navicat的表现完全不同。DataGrip可以清楚地知道,返回的数据是null还是无数据。而Navicat不管是null还是无数据,都是一样的。建议使用DataGrip。
方法1:
select (
select DISTINCT Salary
from Employee
order by Salary DESC
limit 1,1)
as SecondHighestSalary;
distinct是为了去重,因为题目要求第二高的薪水,意思是要去重的。
注意order by 默认是升序
方法2:
select max(Salary) as SecondHighestSalary
from Employee
where Salary < (
select max(Salary) from Employee
);
先找到最大值,然后再从小于最大值的集合里找到最大值,就是第二大的了
方法3:
select
ifnull((select distinct Salary from Employee order by Salary desc limit 1,1),null) as SecondHighestSalary;
ifnull方法,如果参数1是null,那就返回null