千家信息网

Oracle中的分页查询~~~ROWNUM(行号)

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Oracle中的表,除了我们建表时设计的各个字段,其实还有两个字段(此处只介绍2个),分别是ROWID(行标示符)和ROWNUM(行号)。即使我们使用DESCRIBE命令查看表的结构,也无法看到这两个
千家信息网最后更新 2026年11月01日Oracle中的分页查询~~~ROWNUM(行号)

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) uawhere ua.rn between 3 and 4;

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

select id,col from(select rownum rn,u.* from table u where rownum<=4) uawhere 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) uowhere rownum<=4 ) uawhere ua.rn>=3;

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

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

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

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

查询 数据 行号 结果 数据库 页面 字段 两个 实时 就是 面的 选择 一行 实时性 指针 语句 选择性 页码 定位 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 南京欣网互联网络科技有限公司 互联网科技未来 科技伦理 互联网公司 广西拼得多互联网科技有限公司 千方科技属于互联网企业吗 米聚互联网科技南京有限公司排面 互联网公司黑科技创始人 互联网时代的科技公司 上海京穆互联网科技有限公司 互联网科技实习生岗位 广州千川互联网科技有限公司 从那以后互联网科技有限公司 半导体是互联网高科技吗 长沙渺峰互联网科技有限公司 张家口科技产业互联网平台 互联网科技大佬云集 河南商务圈互联网科技有限公司 黑龙江互联网科技公司 恒生科技互联网指数十大成分股 广东猪兼强互联网科技有限公司 科技平台互联网 互联网科技保险 菲比寻常互联网科技 科技赋能互联网健康 互联网科技公司需要的职位 创业天下互联网科技有限公司 移动互联网年度科技创新 互联网第三次科技革命特征 互联网科技和医药行业
0