ORCLE之ROWNUM用法

来源:互联网 发布:网络金融销售是干嘛的 编辑:程序博客网 时间:2024/05/22 04:26

在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(SELECTrt.*, ROWNUM row_numFROM(SELECT USERID,OPERATORNAME FROM sys_user) rtWHEREROWNUM <= 60) stWHEREst.row_num >= 21


原创粉丝点击