oracle rownum终极讲解

oracle中rownum伪字段用得比较频繁,特别是分页之中,但是由于它的一些特殊性很多人可能并不理解它的实际行为,网络上有很多文章介绍这个 rownum的用法,但是很多都讲得非常模糊,或者就是不太全面,大家看起来也非常痛苦,在这里我将给大家全面讲解一下,希望对大家有所帮助:      

 首先我们来认识几点rownum的特殊性:        

      第一、rownum是在记录输出的时候才一步一步的产生的。
       第二、如果之前没有满足条件的记录输出,则后面的rownum始终都是从1开始的。   

      记住以上两点,基本上你也算是非常了解这个伪字段的用法了,下面我来具体分析一下这些特殊性。我们考察如下的 SQL语句:         

select * from Test where rownum >=1;    



 select * from Test where rownum >=2;     



 select * from Test where rownum <= 10;   

假设Test表有15条记录,这里第一条SQL输出15条记录,第2条SQL输出0条,第3条SQL输出10条记录。    

为什么呢?上面我说过了,由于它的特殊性,rownum是在记录输出的时候才产生,所以我们按照下面的步骤来

处理:   

 1)任何在同一条SQL上出现的rownum我们都可以先忽略掉,然后这三条SQL语句都只有

select * from Test    

2) 我们此时输出记录,当输出第一条记录时,此时oracle会安排他的rownum=1,前面也说过了

(如果之前没有满足条件的记录输出,则后面的rownum始终都是从1开始的)  

3)这个时候加上rownum的where条件来筛选这条记录是否满足,我们发现,只有第一条SQL和第3条SQL满足rownum>=1和rownum<=10,而第2条SQL rownum>=2,明显该记录不满足条件,因为输出的第一条记录rownum=1.  

4)输出第2条记录,此时第1条SQL和第3条SQL由于前面都有一条满足条件的记录了,此时rownum会安排成2,

明显第2条记录也满足需求。我们再来看第2条SQL语句,我们此时输出第2条记录,但是由于之前输出的一条记

录被它否决了,即不满足条件,这时的输出的第2条记录rownum仍然等于1,注意了哦,很多人不明白为什么,其

实很简单,如果之前没有满足条件的记录输出,则后面的rownum始终都是从1开始的,只有前面输出了一条满足条件的记录之后,后面的记录rownum才会增加。--简单吧,所以这里对于第2条SQL来讲,他的这个记录rownum还是等于1,又不满足条件。  

5)记录处理其他记录。   

按照上面的的方法你就可以处理任何关于rownum的sql了,比如:  

select * from Test where rownum >=1  and id>5 order by id asc; 

按照上面的方法,首先去掉rownum和排序的order by然后剩下 select * from Test where  id>5; 这里弄完了会

输出结果,然后循环的处理每一条记录,有满足条件的rownum就增加,没有满足条件的记录就不增加。然后对结果进行排序。就这么

简单。为什么要去掉order by?因为排序是结果出来之后才能排序,而结果出来的时候rownum就已经分配了。所以,如果上面这条语句最后打印出来的rownum是拍过序的。

 还有一点要注意,这个rownum的处理过程是针对同一层SQL而言,也就是select 和rownum处于同一个层次才

能这么做。如果是嵌套SQL,特殊情况特殊分析。  

 例如:  

 select * from(  select * from Test where  id>5 and rownum<=6)  t  where rownum >=1 order by t.id asc

上面颜色相同的处于同一个层次。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值