详解oracle分页查询的基础原理

世上最好的保鲜就是不断进步,让自己成为一个更好和更值得爱的人。早安!不要去争取属于别人的东西,否则,费的力越多,得到的越少。早安!

本文从数据查询原理,以及分页实现的方法详细分析了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; 

4rowid一般用不到,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有如下特点:

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

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

3ROWNUM总是从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分页查询的基础原理到此结束。最快的脚步不是跨越,而是继续;最慢的步伐不是缓慢,而是徘徊;最好的道路不是大道,而是坦荡;最险的道路不是陡坡,而是陷阱;最大的幸福不是得到,而是拥有;最好的财富不是金钱,而是健康;最棒的祝福不是将来,而是现在。小编再次感谢大家对我们的支持!

您可能有感兴趣的文章
Oracle如何使用MyBatis中RowBounds如何实现分页查询功能

oracle如何使用rownum的三种分页方式

Oracle带输入输出参数存储过程(包括sql分页功能)

简单实例解释Oracle分页查询

oracle如何实现一对多数据分页查询筛选示例代码