在以前的面试题中,我遇到过这个一个问题,查找出第二高工资的人的工资。
MySql写法:
select Distinct emp.Salary from Employee emp Order by emp.Salary desc limit 1 offset 1;
这段表示将表按照薪水排序,然后offset 1 表示从第一条开始读取,但是不包括第一条,也就是从第二条开始的,limit 1 表示读取一条,这样,就可以获得第二高的薪水了。这个时候,可能出现没有第二高的情况,所以需要注意一下,可以利用IFFULL来判断。
Oracle写法:
思路一:找出最大的那,去除掉再找出最大的,也就是第二高的
select max(emp.Salary)
from employee emp
where emp.Salary<> (select max(emp.Salary) from employee emp)
这样的写法可以达到我们的要求,不过有局限性,例如我要找第10高的,明显,这种写法就显得不合适了。
思路二:利用排序,取第二行数据
select distinct emp.Salary
from (select emp.*, dense_rank() over(order by emp.Salarydesc) as rn
from Employee emp) emp
where rn = 2
在数据库中,数据会以这种形式来呈现,去第二行数据的值,也就是工资第二高的。也就是相当于在给数据排序完成后,后面多加一个标识,利用这个标志可以取得想要的数据,要第几高的数据我们就取第几行。