分页查询原理oracle,Oracle中的SQL分页查询原理和方法详解

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51534006,谢谢!

本文分析并介绍Oracle中的分页查找的方法。

Oracle中的表,除我们建表时设计的各个字段,其实还有两个字段(此处只介绍2个),分别是ROWID(行标示符)和ROWNUM(行号),即便我们使用DESCRIBE命令查看表的结构,也是看不到这两个列的描写的,由于,他们实际上是只在数据库内部使用的,所以也通常称他们为伪列(pseudo column)。

下面我们先建表并添加1些数据来验证上面的说明。

建表:

create table users(

id integer primary key,

name nvarchar2(20)

)

插入数据:

insertintousers(id,name)values(1,'tom');

insertintousers(id,name)values(2,'cat');

insertintousers(id,name)values(3,'bob');

insertintousers(id,name)values(4,'anxpp');

insertintousers(id,name)values(5,'ez');

insertintousers(id,name)values(6,'lily');

使用describe命令查看表结构:

5de8779126e615d7061754fc9eb22406.png

可以看到,确切只有建表时的两个字段。

但我们可以查询的时候,查找到伪列的值:

selectrowid,rownum,id,namefromusers;

结果:

6084f55c9791ca28b3611634035c05c5.png

这个rowid我们1般用不到,Oracle数据库内部使用它来存储行的物理位置,是1个18位的数字,采取base⑹4编码。

而这个rownum,我们也正是使用它来进行分页查询的,它的值,就是表示的该行的行号。

对分页,我们只要想办法可以查询到从某1起始行到终止行就能够的,分页的逻辑可以放到程序里面。

因而,我们天经地义会想到以下语句查询第2页的数据(每页2条数据,页码从1开始,所以起始行的行号为 (页码⑴)*每页长度+1=3,终止行的行号为 页码*每页长度=4):

select*fromuserswhererownum>=3rownum<=4;

哈哈!是否是发现没有任何结果,缘由很简单,Oracle机制就是这样的:由于第1条数据行号为1,不符合>=3的条件,所以第1行被去掉,之前的第2行变成新的第1行(即这个行号不是写死的,可以理解为是动态的),如此下去,1直到最后1行,条件始终没法满足,所以就1条数据也查不出来。

既然找到了缘由,解决方法也就很明显了,我们只要将行号查询出来生成1个结果集,然后再从这个结果集中,选择行号大于我们设定的那个值就能够了,上面的分页查找正确的写法应当是这样:

selectid,namefrom(

selectrownum rn,u.*fromusers u)ua

whereua.rn between3and4;

上面的语句还可以优化:>=不能用,但是<=是可以的,我们不需要在子查询中将结果全部查出来,首先使用终止行挑选子查询的结果,SQL以下:

selectid,namefrom(

selectrownum rn,u.*fromusers uwhererownum<=4)ua

whereua.rn>=3;

结果:

85d6f226cd118e8b38b75809bd601559.png

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

selectrownum,id,namefromusers orderbyname;

结果:

c36c3281a899156ce92af750b5dcdcef.png

可以看到,我们说行号完全是动态的,也是不准确的,这时候候的行号其实不是经过 order by 后新结果的增序行号。

但有了上面的嵌套查询的经验,这里也能够好好利用1下,怎样做呢:先查找出排序好的结果集,然后利用上面的方法得到终究结果,sql以下:

selectid,namefrom(

(selectrownum rn,uo.*from

(select*fromusers u orderbyname)uo

whererownum<=4))ua

whereua.rn>=3;

依照上面的结果,正确的分页结果应当是id为2和5的,看下结果:

6f413bc28d1772b696cb9ae2ff75014e.png

OK,结果正确。

其实连表查询之类的,也是差不多的,多点嵌套而已,掌握了原理,随意分析1下就可以写出对应的SQL了,而编写SQL时,我们也得动动头脑,毕竟SQL也是由优劣之分的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值