编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
+----+--------+
Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
---------------------+
#Sqlserver、Mysql、Oracle通用
#查询employee表中Salary仅小于最大Salary
SELECT MAX(salary) AS SecondHighestSalary FROM employee WHERE salary <(SELECT MAX(salary)AS salary FROM employee )
Mysql语法
#按照Salary降序排列取Limit 1(也就是最大的值)的下一个值,之后进行ifnull判断是否为空
SELECT IFNULL((SELECT Distinct Salary FROM Employee ORDER BY Salary DESC limit 1,1),null) AS SecondHighestSalary
Sqlserver语法
SELECT ISNULL(Salary,NULL)SecondHighestSalary FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Salary desc)AS ID, Salary FROM Employee) AS A
WHERE ID = 2
Oracle语法
注意Oracle rownum陷阱,不能对Oracle 的rownum 直接进行 rownum> rownum>= rownum = 操作,因为第一条不满足去掉的话,第二条的rownum又成了1,所以永远没有满足条件的记录。所以Oracle分页里边的select 先用 rownum <= xxx ,外边再rownum>=xxx
想要使用的话需要这样,再嵌套一层select :select A.* from (select e.*,rownum rn from emp e)A where A.rn>=1
select nvl(Salary,null)SecondHighestSalary
from (select t.*, rownum rn
from (select Salary from Employee e order by Salary desc) t
where rownum <= 2) A
where A.rn >= 2
Oracle 开窗函数
select nvl(Salary,null)SecondHighestSalary from
(select e.Salary,row_number() over(order by Salary desc) as id from Employee e) t
where t.id=2
更多Sql练习请关注公众号Excel螺丝钉