oracle分页查询原理浅析

Posted For_elegant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle分页查询原理浅析相关的知识,希望对你有一定的参考价值。

 

原因一 oracle默认为每个表生成rowmun,rowid字段,这些字段我们称之为伪列

1 创建测试表

CREATE TABLE TEST(
ID NUMBER,
NAME VARCHAR2(20)
)

2 插入测试数据

复制代码
INSERT INTO TEST VALUES (1,\'张三\');
INSERT INTO TEST VALUES (2,\'李四\');
INSERT INTO TEST VALUES (3,\'王五\');
INSERT INTO TEST VALUES (4,\'赵六\');
INSERT INTO TEST VALUES (5,\'郑七\');
INSERT INTO TEST VALUES (6,\'胡八\');
INSERT INTO TEST VALUES (7,\'刘九\');
复制代码

3 查看表字段,证实自带的字段  

select rowid,rownum,id,name from TEST;  

4 rowid一般用不到,Oracle内部用来存储行的物理位置,和分页相关的就是rownum,也就是行号

 

1  查询小于5的行,查询出四条结果

select  rowid,rownum,id,name from test where rownum <5;

 

2 查询大于2小于5的行

select rownum,id,name from test where rownum>2 and rownum <5;

发现什么也没查出来,什么原因呢?,

rownum有如下特点:

ROWNUM只适用于小于或小于等于,如果进行等于判断,那么只能等于1;

2 ROWNUM是oracle系统顺序分配的行的编号,返回的第一行分配的是1,第二行是2,依此类推;

ROWNUM总是从1开始

4 第一条数据行号为1,不符合>2的条件,则第一行被去掉,之前的第二行变为新的第一行,如此下去,一直到最后一行,条件始终没法满足,所以就一条数据也查不出来。

3 正确写法:因为>用不了,将行号用内层查询查询出来当做一个结果集,在外层用内层结果集进行比较即可

select  rownum,id,name  from
( select rownum rn, u.* from test u where rownum<5) un
where un.rn>2

4 如果进行分页的话,比如每页三行,要查询第二页,则相当于查4,5,6条,起始行4= (页码-1)*每页长度+1,结束行6=页码*每页长度

select rownum,id,name from (
       select rownum rn , t.* from test t where rownum <=6) n
where n.rn>=4

5 同样的可以把4中查询改为最常见的三层结构

 

复制代码
   select rownum,id,name from (
       select rownum rn, n.* from 
             (
                 select * from test  --最内层循环该怎么写怎么写
              )  n where rownum <=6  --小于限制写在第二层
       ) 
   where rn>=4   
                                                                                                                

以上是关于oracle分页查询原理浅析的主要内容,如果未能解决你的问题,请参考以下文章

分页原理浅析

pagehelper分页原理浅析

oracle 分页 使用rownum的分页方式

关于oracle分页顺序问题,我的代码可以实现分页,但是新添加进去的,顺序不是在最后

Oracle分页查询中排序与效率问题

解决Oracle分页查询中排序与效率问题