黄刚的专栏

No Complain ,Just Do It !

原创 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

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

发表于 @ 2008年07月09日 15:16:00|评论(loading...)|收藏

新一篇: JAVA 基础细节汇总(持续更新中....) | 旧一篇: 类彩票选号算法

用户操作
[即时聊天] [发私信] [加为好友]
黄刚
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
黄刚的公告
权当备忘,分享经验点滴,不在乎内容是否简单,简单中其实更能体现出不平凡,不喜欢空谈的文章,更愿意实际一点,为需要的朋友做点贡献,如果能留下您宝贵的评价,相信您也可以让众多朋友受益,我分享,我快乐。



分享快乐
最近天气情况
文章分类
收藏
代码质量
各类API查询
追求代码质量
追求代码质量: 测试 Struts 遗留的应用程序
追求代码质量: 谨防紧密耦合!
发表论文
结合混沌密码理论的彩色图象水印算法
技术文章
finally子句和try子句中return的先后关系,以及原理
Hibernate包作用详解
HSQLDB中文网站
Java 1.5被忽略了的小动作
Java XML API 漫谈
Java 核心技术专题
JavaScript 打印web页面
Java类加载内幕
Java编程极限考验:ClassLoader类装载策略
java调用dll
JMX
Reactor模式和NIO
Rope:理论与实践 为何以及何时使用 Ropes for Java 操纵字符串
Spring 系列: Spring 框架简介
Struts 与 Velocity 的集成
xdoclet
了解 Web 服务规范
使用 CAS 在 Tomcat 中实现单点登录
使用 Velocity 实现客户端和服务器端模板
使用spring2.5注释驱动的IOC功能
初探Java类加载机制的奥秘(zz)
在方法签名中使用控制反转(IoC)
看看baidu是如何AJAX跨域的
认识 JsonML
配置适用于正式使用环境下的Tomcat Web服务器双向SSL认证
设计模式
Java 设计模式与建模专题
jive的设计模式-jive源代码研究2
设计模式(Patterns in Java)
设计模式学习笔记-写得很好
系统架构
Lessons from Internet Services: ACID vs. BASE
与冯大辉谈数据库架构
互联网开放平台技术趋势和讨论
分布式系统中的一致性和可用性
可伸缩性最佳实践:来自eBay的经验
构建的可伸缩性和达到的性能
牺牲一致性来换取分布式架构的可伸缩性
谈InfoQ.com网站架构
高伸缩性网站架构分析
存档
Csdn Blog version 3.1a
Copyright © 黄刚