ORACLE之ROWNUM用法

本文解析Oracle数据库中ROWNUM特性在分页查询时的常见误区,解释为何某些分页查询无法返回预期结果,并提供正确实现分页查询的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在oracle中的rownum作为行号  在分页处理方面有着很大的便利

但是在操作rownum时,总会出一些很奇怪的结果   接下来就来针对rownum的性质来进行讲解

举一个例子

一个表共40条数据 ,想要取出前20条数据  会这么写   SELECT * FROM T_USER WHERE ROWNUM <=20  结果也是正确的

但要是想取出这个表的后20条数据,那么用   SELECT * FROM T_USER WHERE ROWNUM >=20  结果就是为空

这就令人感到费解  明明数据表中是有数据的   数据量也大于20条 为什么得到的结果集怎么是空呢


究其原因,还是因为rownum是这个结果集的伪列  是得到结果集后加上的(需要先有结果集) rownum是一个序列,从oracle数据库从数据文件或者缓存中读取数据的顺序


这样说还是有点抽象  简单的来说就是当结果集被查询出来之后  加上rownum开始进行判断  当rownum=1不符合条件时,就会去掉rownum=1的那条,那么rownum=2的就会变成rownum=1的,那么一直不满足一直去除  最后结果集中就没有了数据


那么以下现象就变的正常了


1.SELECT * FROM T_USER WHERE ROWNUM >1没有数据,SELECT * FROM T_USER WHERE ROWNUM >=1可以查出所有数据

那是因为ROWNUM >1的情况,会进入一直去掉第一条的情况  导致所有结果集被去除掉


2.SELECT * FROM T_USER WHERE ROWNUM !=10会取到前9条,而不是40-1=39条

这因为当rownum=10时,条件不满足后一直去除结果集的内容  导致只有9条数据


3.为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果

原因同上一样这是因为 rownum 总是从 1 开始


根据以上原因,程序中的分页一般采用查询生成rownum列 然后嵌套进行分页查询

SELECT
	*
FROM
	(
		SELECT
			rt.*, ROWNUM row_num
		FROM
			(SELECT USERID,OPERATORNAME FROM sys_user) rt
		WHERE
			ROWNUM <= 60
	) st
WHERE
	st.row_num >= 21


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古柏树下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值