ORACLE之ROWNUM⽤法
在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
oracle数据库怎么查询表不符合条件时,就会去掉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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论