在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