Oracle分页查询SQL语句怎么写

来源:微信开发网作者:深圳SEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《Oracle分页查询SQL语句怎么写》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Oracle分页查询SQL语句怎么写》有用,将其分享出去将是对创作者最好的鼓励。

Oracle数据库本身没有像MySQL那样直接的LIMIT分页语法,实际开发中通常使用ROWNUM伪列来实现分页查询功能,ROWNUM是Oracle为查询结果集中的每一行分配的一个序号,从1开始递增。

Oracle分页查询SQL语句怎么写

Oracle分页查询的核心原理

ROWNUM的特性是,它是在查询结果返回之后才进行编号的,而且只能使用小于号或者小于等于号进行筛选,不能直接使用大于号或者大于等于号。如果直接使用大于号筛选,会返回空结果,因为ROWNUM从1开始,第一条数据不满足大于N的条件就会被过滤,后续数据的ROWNUM也不会再生成。

两种常用的分页查询写法

写法一:两层嵌套查询

这是最经典的分页写法,先在内层查询中给所有数据加上ROWNUM,然后在外层查询中筛选ROWNUM的范围,实现分页效果。假设我们要查询用户表user_info,每页显示10条数据,查询第2页的数据,示例代码如下:

-- 查询user_info表第2页数据,每页10条
SELECT *
FROM (
    SELECT t.*, ROWNUM rn
    FROM (
        -- 内层是最原始的业务查询SQL,可以加排序等条件
        SELECT * FROM user_info ORDER BY create_time DESC
    ) t
    WHERE ROWNUM <= 20  -- 结束行号,页大小*页码,这里10*2=20
)
WHERE rn >= 11  -- 起始行号,(页大小*(页码-1))+1,这里10*(2-1)+1=11

写法二:使用ROW_NUMBER()分析函数

除了使用ROWNUM,还可以使用Oracle的分析函数ROW_NUMBER()来实现分页,这种方式可以在查询时直接生成行号,不需要额外嵌套一层给ROWNUM取别名。同样查询第2页10条数据的示例代码如下:

SELECT *
FROM (
    SELECT t.*, ROW_NUMBER() OVER (ORDER BY create_time DESC) AS rn
    FROM user_info t
)
WHERE rn BETWEEN 11 AND 20  -- 直接筛选行号范围,11到20对应第2页

常见错误写法及原因

很多开发者刚接触Oracle分页时会写出下面的错误代码:

-- 错误写法示例
SELECT * FROM user_info WHERE ROWNUM >= 11 AND ROWNUM <= 20 ORDER BY create_time DESC

这段SQL会返回空结果,原因就是前面提到的ROWNUM特性:ROWNUM是从1开始分配的,第一条数据的ROWNUM是1,不满足>=11的条件就会被过滤,后续数据不会再生成ROWNUM,所以最终查询不到任何数据。另外如果先加WHERE ROWNUM条件再排序,排序后的行号会混乱,不符合预期的分页顺序,所以排序操作一定要放在最内层的查询中。

分页参数说明

分页查询中常用的参数对应关系如下:

参数名称含义计算方式
pageNum当前页码从1开始传入
pageSize每页条数根据业务需求设定,比如10、20
startRow起始行号pageSize * (pageNum - 1) + 1
endRow结束行号pageSize * pageNum

实际开发注意事项

  • 最内层的查询一定要先完成排序、过滤等业务逻辑,再进行分页操作,避免分页后的数据顺序不符合预期。
  • 如果查询的数据量非常大,建议在排序列上建立索引,提升分页查询的效率,尤其是深分页场景。
  • 两种写法都可以实现分页功能,两层嵌套ROWNUM写法是Oracle早期常用的方式,兼容性更好;ROW_NUMBER()写法逻辑更直观,适合熟悉分析函数的开发者使用。

Oracle分页查询SQL语句ROWNUM修改时间:2026-07-13 13:57:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。