本文最后更新于 134 天前。
MySQL:
先降序排序,再去重,去掉第一行(OFFSET 1),选第二行(LIMIT 1),如果无第二高的薪水返回空,为了返回NULL,再使用IFNULL函数,若不为空,返回第一个参数,为空返回第二个参数
SELECT (
IFNULL((SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1), NULL)
) AS SecondHighestSalary
Oracle:
先按降序排序去重,再从里面选出salary和行号,选出行号等于2的一行,再选出salary,使用NVL相当于MySQL的IFMULL。
在Oracle数据库中,FROM DUAL
是一个特殊的语法,通常用在SELECT语句中。当你编写一个SELECT语句,而这个查询并不依赖于任何具体的表或者视图时,就需要用到FROM DUAL
。DUAL
是一个虚拟的表,实际上它只包含一行一列,通常用来返回常量、运行函数或者执行一些计算。
SELECT NVL(
(
select Salary
from (select rownum as rw, Salary
from (select distinct Salary
from Employee
order by Salary desc))
where rw = 2
), NULL
) SecondHighestSalary
FROM DUAL