oracle rownum终极讲解
oracle中rownum伪字段用得比较频繁,特别是分页之中,但是由于它的一些特殊性很多人可能并不理解它的实际行为,网络上有很多文章介绍这个 rownum的用法,但是很多都讲得非常模糊,或者就是不太全面,大家看起来也非常痛苦,在这里我将给大家全面讲解一下,希望对大家有所帮助:
首先我们来认识几点rownum的特殊性:
第一、rownum是在记录输出的时候才一步一步的产生的。
第二、如果之前没有满足条件的记录输出,则后面的rownum始终都是从1开始的。
记住以上两点,基本上你也算是非常了解这个伪字段的用法了,下面我来具体分析一下这些特殊性。我们考察如下的 SQL语句:
假设Test表有15条记录,这里第一条SQL输出15条记录,第2条SQL输出0条,第3条SQL输出10条记录。
为什么呢?上面我说过了,由于它的特殊性,rownum是在记录输出的时候才产生,所以我们按照下面的步骤来
处理:
1)任何在同一条SQL上出现的rownum我们都可以先忽略掉,然后这三条SQL语句都只有
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了,比如:
按照上面的方法,首先去掉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
上面颜色相同的处于同一个层次。