欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Oracle传统分页查询使用ROWNUM需要三层查询的原因

Oracle传统分页查询使用ROWNUM需要三层查询的原因

2025/6/21 21:06:43 来源:https://blog.csdn.net/wsx9172/article/details/148706450  浏览:    关键词:Oracle传统分页查询使用ROWNUM需要三层查询的原因

下面用查询工资排名21-30的员工信息,举例Oracle分页查询语法

Oracle传统分页查询语法:

SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT  *FROM employeeORDER BY salary desc) a WHERE ROWNUM <= 30
) 
WHERE rn > 20;

ROWNUM伪列是Oracle中查询数据后自动赋值的序号字段,从1开始,逐行递增。传统分页方式通过ROWNUM伪列实现,需要比较复杂的三层查询,下面分析一下为什么需要三层。

Oracle中查询语句各阶段执行顺序
步骤执行阶段说明
1FROM / JOIN首先从表中读取数据,执行连接等操作。
2WHERE过滤数据(此时还 没有 ROWNUM)。
3分配 ROWNUM(特殊阶段)Oracle 在结果集中给每一行分配 ROWNUM(此时尚未排序)。
4ROWNUM 条件生效可以用来过滤,比如 ROWNUM <= 10。注意:不能用 ROWNUM > 10 直接分页,因为 ROWNUM 是先从1开始依次赋值的。
5GROUP BY对数据分组。
6HAVING对分组结果进一步过滤。
7SELECT返回指定的字段。
8ORDER BY最后才排序!这意味着ROWNUM 赋值发生在排序前,不是排好序后再编号。
单层查询为什么不行
 SELECT employee.*FROM employeeWHERE RUWNUM > 20 AND RUWNUM <= 30ORDER BY salary desc

ROWNUM伪列是在查询数据之后赋值的,第一条符合过滤条件的记录,ROWNUM被赋值为1,第二条符合过滤条件的记录ROWNUM为2…,因为ROWNUM初始值为1,不满足ROWNUM > 20条件,导致始终没有满足条件的记录,ROWNUM无法自增,最终查出0条记录。

二层查询为什么不行
SELECT t.* FROM (SELECT employee.*, RUWNUM RNFROM employeeORDER BY salary desc
) tWHERE t.RN > 20 AND t.RN <= 30

ROWNUM伪列是在ORDER BY之前执行的,最后虽然能查出结果,但不满足排序规则。

三层查询的作用
  • 第一层查询:将数据按指定规则排序。
  • 第二层查询:ROWNUM从1开始,所以 ROWNUM <= 30过滤前30名的记录。
  • 第三层查询:RN > 21 过滤21名及之后记录。

第二层和第三层的过滤条件不能颠倒,要先判断小于,再判断大于。

附录Oracle12c以后支持分页查询语法:

SELECT * FROM employee
ORDER BY salary 
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

注意偏移量OFFSET从0开始,上面SQL表示从21名开始向后查询10条记录。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词