ORACLE 三层分页

Three-layer Paging
关键字Rownum总结:

1)rownum是oracle专用的关健字
2)rownum与表在一起,表亡它亡,表在它在
3)rownum在默认情况下,从表中是查不出来的
4)只有在select子句中,明确写出rownum才能显示出来
5)rownum是number类型,而且唯一连续
6)rownum最小值是1,最大值与总记录条数相同
7)rownum参与关系运算,通常rownum只用于<或<=关系运算
因为rownum是查询出结果后才加入序号生成的伪列,必须从1开始,所以只能用小于某个正整数或者等于1才会有结果;如果把这个伪列取别名作为一个子查询的实列,此时就可以嵌套用大于某个值实现分页。

oracle分页有通用写法,最简单的如假设查询表中5-9条记录:

select yy.* from
        (select rownum ids,emp.* from emp where rownum<=9) yy
where ids>=5;​

一般说来from后可能用真实表名,也可能用子查询看作的表名,同时真实表和子查询看作的表会做连接查询。而且很多时候,我们不会盲目的分页查找,一般先会按某一个或多个字段的升序或降序分页,即包含 order by 语句的分页查询。

select yy.*from                                 
        (select rownum ids,e.* from                 
              (select * from emp order by name) e         //第一层:排序
       where rownum<=9) yy                                //第二层:定行号
where ids>=5;                                             //第三层:分页过滤​

这里不能忘了e.*,不然没有完整数据,rownum < 10和 ids > 5则表示分页的范围。还有一种写法:

select yy.*from                                 
        (select rownum ids,e.* from                 
              (select * from emp order by name) e         
        ) yy                                     
where ids>=5 and ids<=9;

不过这种嵌套查询没用到oracle的外层条件内推机制,它只能将分页条件推到第二层,无法推到内层查询中,于是中间层会先查询出所有的数据,最后再外层分页过滤,效率会低很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值