You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:15:19