题目要求在不使用order by语句的情况下输出(to_date='9999-01-01')时salary第二大的员工信息,除了大多数回答采用的max()方法,我在这里提供另一种思路,即使用窗口函数dense_rank:
首先介绍一下窗口函数的用法。有三种排序的窗口函数:
1)RANK()
在计算排序时,若存在相同位次,会跳过之后的位次。
例如,有3条排在第1位时,排序为:1,1,1,4······
2)、DENSE_RANK()
这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。
例如,有3条排在第1位时,排序为:1,1,1,2······
3)、ROW_NUMBER()
这个函数赋予唯一的连续位次。
例如,有3条排在第1位时,排序为:1,2,3,4······
用法:
<窗口函数> OVER ( [PARTITION BY <用于分组的字段> ]
ORDER BY <排序的字段> )
*其中[ ]中的内容可以忽略
下面是本题的详解:

1、先在salary表上操作,按照to_date分组,使用dense_rank函数计算得到每一个to_date取值下的salary的排名顺序,记为rk

select emp_no,salary,dense_rank() over (partition by to_date order by salary desc) as rk
from salaries
where to_date='9999-01-01'

这样我们就得到了一个子表,它记录了emp_no,salary,以及to_date='9999-01-01'时的salary的排名
2、接下来连接employees表和这个子表(注意,子表一定要命名,此处记为b),并限定rk=2就能得到题目要求的信息(完整的查询代码如下)

select b.emp_no,b.salary,e.last_name,e.first_name from 
employees as e inner join
(select emp_no,salary,dense_rank() over (partition by to_date order by salary desc) as rk
from salaries
where to_date='9999-01-01') as b
on e.emp_no=b.emp_no
where rk=2;