Oracle SQL技术问题:查询薪资最低的5名员工的ID_No与姓名
解决Oracle查询薪资最低5名员工的问题
嘿,我懂你的困扰——Oracle确实不支持LIMIT或者TOP这类其他数据库常用的关键字,得用它专属的语法来实现这个需求。下面给你两种实用的解决办法:
方法1:使用ROWNUM(传统方式)
Oracle的ROWNUM是给查询结果集的行分配编号的伪列,但要注意它会在排序前就分配编号,所以必须先做好薪资升序排序,再在外层筛选前5行:
SELECT ID_No, Name FROM ( -- 先按薪资升序排序,确保薪资最低的排在前面 SELECT ID_No, Name, Salary FROM Employees ORDER BY Salary ASC ) sorted_emps WHERE ROWNUM <= 5;
方法2:使用窗口函数(更灵活)
如果需要处理薪资并列的情况(比如多个员工薪资同为第5低,想把他们都选出来),用窗口函数会更合适。推荐用ROW_NUMBER()、RANK()或者DENSE_RANK():
2.1 严格取前5行(即使有并列也只选其中部分)
SELECT ID_No, Name FROM ( SELECT ID_No, Name, Salary, -- 按薪资升序给每行分配唯一编号 ROW_NUMBER() OVER (ORDER BY Salary ASC) AS row_rank FROM Employees ) ranked_emps WHERE row_rank <= 5;
2.2 包含所有薪资并列的员工
如果想把所有薪资排在前5位的员工都包含(比如第5名有3人,这3人都会被选中),可以用DENSE_RANK():
SELECT ID_No, Name FROM ( SELECT ID_No, Name, Salary, -- 相同薪资会获得相同排名,排名不跳跃 DENSE_RANK() OVER (ORDER BY Salary ASC) AS salary_rank FROM Employees ) ranked_emps WHERE salary_rank <= 5;
两种方法里,ROWNUM是Oracle最经典的写法,而窗口函数在处理复杂排序和排名场景时更强大,你可以根据实际需求选择~
内容的提问来源于stack exchange,提问作者Alexandru Petrea
相关产品推荐
相关产品推荐

