oracle 分页查询

 

说道oracle分页,不得不提一个字段

rownum:
 1 oracle下select语句每个结构集都有一个伪字段存在,叫做rownum,用于标识每条记录的行号
 2 从1开始,单次递增1,
 3 只有<,<=,没有 =,>,>=(据说是为了效率考虑做的限制)
 4 在查询取数据时产生序号,按照默认的顺序生成
 5 基于 rownum不能实现 >, >=, =的操作,我们可以利用
 5.1 用子查询将需要查询的字段放在临时表,同时将rownum这个临时字段用别名eg:r方式存储在临时表
 5.2 去临时表中查询,此时临时表的 rownum已经不再是临时字段,因此利用此字段实现分页查询  eg:  2=< r <=9
 

看如下的处理结果,已经将rownum按照sal降序后规则显示

select rownum ,ename, sal from (select * from emp order by sal desc)

ROWNUMENAMESAL
1Tom_ABCD6000
2KING5000
3FORD3000
4SCOTT3000
5JONES2975
6BLAKE2850
7CLARK2450
8ALLEN1600
9TURNER1500
10MILLER1300
11WARD1250
12MARTIN1250
13ADAMS1100
14JAMES950
15SMITH800



然后在去上面表中查询,将rownum作为业务字段(非临时字段)执行 >= <=操作
select r,ename, sal from (select rownum r,ename, sal from (select * from emp order by sal desc)) where r >= 5 and r<=9;  (oracle实现分页 是通过嵌套行号最终作为非伪列字段方式来实现)

 

RENAMESAL
5JONES2975
6BLAKE2850
7CLARK2450
8ALLEN1600
9TURNER1500


 
 
 当rownum 和  order by一起使用时,会首先处理rownum的条件,然后在进行排序,这个方式肯定不是我们需呀的。
 
 
 相对于oracle, mysql分页就简单的多:
 select * from emp order by  sal desc limit 5,10;

 

 

查看下面操作,感受下rownum:

select rownum,empno,ename,sal from emp order by sal desc;

ROWNUMEMPNOENAMESAL
11001Tom_ABCD6000
107839KING5000
147902FORD3000
97788SCOTT3000
57566JONES2975
77698BLAKE2850
87782CLARK2450
37499ALLEN1600
117844TURNER1500
157934MILLER1300
47521WARD1250
67654MARTIN1250
127876ADAMS1100
137900JAMES950
27369SMITH800

 

上面的排序后,rownum是不会随着排序后的变化而变化的(这个数值生成后就固定,不会变更,可以类比理解为  name字段,zhangsan, lisi, wangwu....)

 

如果用下面这种查询方式,永远只能将 Tom_ABCD, ALLEN,SMITH 这三个人查出来

select rownum,empno,ename,sal from emp  where rownum <=3 order by sal desc;

ROWNUMEMPNOENAMESAL
11001Tom_ABCD6000
37499ALLEN1600
27369SMITH800

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值