Oracle中的分页查询~~~ROWNUM(行号)
admin
2023-04-15 02:01:24
0

Oracle中的表,除了我们建表时设计的各个字段,其实还有两个字段(此处只介绍2个),分别是ROWID(行标示符)和ROWNUM(行号)。即使我们使用DESCRIBE命令查看表的结构,也无法看到这两个列的描述,因为它们其实是只在数据库内部使用的,所以也通常称它们为伪列(pseudo column)。
建一个只有两个字段(id,col)的表。使用describe命令查看表结构,可以看到确实只有建表时的两个字段。但我们可以查询的时候,可以查找到伪列的值。

select rowid,rownum,id,col from table;

这个rowid我们一般用不到,Oracle数据库内部使用它来存储行的物理位置,是一个18位的数字,采用base-64编码。而这个rownum,我们正是用它来进行分页查询的,它的值,就是表示的该行的行号。
对于分页查询,我们只要想办法可以查询到从某一起始行到终止行就可以的,分页的逻辑可以放到程序里面。于是,我们理所当然会想到如下语句查询第2页的数据(每页2条数据,页码从1开始,所以起始行的行号为 (页码-1)*每页长度+1=3,终止行的行号为 页码*每页长度=4):

select * from table where rownum>=3 rownum <= 4;

出人意料,没有任何结果。原因很简单,Oracle机制就是这样的:因为第一条数据行号为1,不符合>=3的条件,所以第一行被去掉,之前的第二行变为新的第一行(即这个行号不是写死的,可以理解为是动态的),如此下去,一直到最后一行,条件始终没法满足,所以就一条数据也查不出来。
对症下药,要想解决这个问题,我们只要将行号查询出来生成一个结果集,然后再从这个结果集中,选择行号大于我们设定的那个值就可以了,上面的分页查找正确的写法应该是这样:

select id,col from(
select rownum rn,u.* from table u) ua
where ua.rn between 3 and 4;

上面的语句还可以优化:虽然不能用">=",但"<="却可以用。为提高查询效率,我们可以使用终止行筛选子查询的结果,SQL如下:

select id,col from(
select rownum rn,u.* from table u where rownum<=4) ua
where ua.rn >= 3;

很多时候,我们并不是盲目的分页查找的,而是按某一个或多个字段的升序或降序分页,即包含 order by 语句的分页查询,我们先看一下 order by 的查询结果中rownum是怎样的:

select rownum,id,col from table order by col;

结果,这时候的行号并不是经过 order by 后结果的增序行号。
但有了上面的嵌套查询的经验,这里也可以好好应用一下,怎么做呢:先查找出排序好的结果集,然后应用上面的方法得到最终结果,sql如下:

select id,col from(
select rownum rn,uo.* from
(select * from table order by col) uo
where rownum<=4 ) ua
where ua.rn>=3;

分页效果的实现,思路有三种:

其一:纯JS实现分页。一次性查询记录并加载到html的table中。然后通过选择性地显示某些行来达到分页显示的目的。这是一种伪分页,障眼法而已。只能用于数据少的情况下。一旦数据多了,十几万条数据加载到html中会变得很慢。而且不实时,一次加载完后数据就写死在页面了,若数据库中有变化,浏览器端显示的仍是上次加载过来的数据。

其二:一次查询,分批显示。
就是说,我们可以执行一个数据库查询操作,得到结果集rs。然后,通过指针的移动来显示当前页面的记录。这样,就可以以 rs.absolute(当前页面号*每页记录数)定位到当前页的第一条记录,然后通过while循环显示n条记录(n为每页显示记录数)。在跳页时,只需修改currentPage,即可在重定位到下一页时把当前页面号改掉,重新定位记录指针,通过while遍历显示n条记录。与JS选择性显示不同,这里是选择性遍历。与JS分页不同的是,这里分页每次跳页修改的是遍历的指针,每次跳页都要进行一次全面查询。同样地,不适合大数据量查询。这里比JS分页优化的地方在于——实时性。每次跳页都会查询一次数据库,保证数据的实时性。

其三:在服务端分页。跳到第n页才查询、显示第n页内容。要点就是根据客户端表格的“页面”计算出数据库要查询的当前页面的第一条记录的位置。优点:实时性:跳页才查询。数据量小:只加载当前页的记录进行显示。

相关内容

热门资讯

今日重大通报“麻辣竞技有挂吗?... 网上科普关于“麻辣竞技有没有挂”话题很是火热,小编也是针对麻辣竞技作*弊开挂的方法以及开挂对应的知识...
重磅消息“鸿运会十三张开挂神器... 家人们!今天小编来为大家解答鸿运会十三张透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里...
最新引进“樱花之盛炸/金/花开... 最新引进“樱花之盛炸/金/花开挂器?”(必胜开挂神器)您好,樱花之盛炸/金/花这个游戏其实有挂的,确...
最新引进“卡农牛牛开挂器?”(... 家人们!今天小编来为大家解答卡农牛牛透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里买很...
玩家分享攻略“二八杠怎么开挂?... 有 亲,根据资深记者爆料二八杠是可以开挂的,确实有挂(咨询软件无需打开直...
【第一财经】“欢乐斗地主怎么开... 【第一财经】“欢乐斗地主怎么开挂?”(太坑了原来有挂)您好,欢乐斗地主这个游戏其实有挂的,确实是有挂...
重磅消息“黑桃A是不是有挂?”... 有 亲,根据资深记者爆料黑桃A是可以开挂的,确实有挂(咨询软件无需打开直...
【第一消息】“来趣广西麻将到底... 家人们!今天小编来为大家解答来趣广西麻将透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里...
玩家最新攻略“星悦麻将怎么开挂... 玩家最新攻略“星悦麻将怎么开挂?”(必胜开挂神器)您好,星悦麻将这个游戏其实有挂的,确实是有挂的,需...
【第一消息】“福麻圈到底是不是... 您好:福麻圈这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游戏中...