在查询中,我们可以注意到,类似于"select xx from table where rownum < n"(n>1)这样的查询是有正确含义的,而"select xx from table where rownum = n"这样的查询只在n=1的时候成立,"select xx from table where rownum > n"(n>1)这样的查询只能得到一个空集。另外"select xx from table where rownum > 0"这个查询会返回所有的记录。这是为什么呢?原因就在于Oracle对rownum的处理上,rownum是在得到结果集的时候产生的,用于标记结果集中结果顺序的一个字段,这个字段被称为"伪数列",也就是事实上不存在的一个数列。它的特点是按顺序标记,而且是逐次递加的,换句话说就是只有有rownum=1的记录,才可能有rownum=2的记录。

  让我们回头来分析一下在where中使用rownum作为查询条件的情况。在rownum取=1,或者rownum <= n (n>1)的时候,没有问题。那么为什么当条件为rownum = n或者rownum >= n时明明有数据却只能得到一个空集呢?假设我们的查询条件为rownum = 2,那么在查询出的第一条记录的时候,oracle标记此条记录rownum为1,结果发现和rownum=2的条件不符,于是结果集为空。写到这里,我忽然有一个有趣的想法:假如有一条查询语句为select xx,yy from table where zz > 20 and rownum < 10,那么在执行的时候,是先按照zz>20的条件查询出一个结果集,然后按照rownum取出前10条返回?还是在按照zz>20的条件先查询,然后有一个记录就标记一个rownum,到rownum<10的时候就停止查询?我觉得应该是后者,也就是在执行语句的时候,不是做full scan,而是取够数据就停止查询。要验证这个想法应该很简单,找一个数据量非常大的表进行查询就可以了。可惜目前我没有这样的表。

  我们可以看出,直接使用rownum是要受到限制的。但是很容易遇到这样的需求"查出符合条件的第xx条到第xx条记录",比如页面的分页处理。这个时候如何构造出适合自己的结果集?嗯,墙边那位说全取出来手工挑选的哥们可以拉出去了。当然这样做也是可以的,但是前提是整个数据集的数据条数不多的情况下。假如遇到上十万百条的数据,全部取出来的话,用户就不用干别的事情了。这个时候用户应该怎么做呢?当然就是要用到我们介绍的rownum拉!rownum不是个"伪数列"么,好说,我们现在把它弄成一个实在的字段就可以了。

  具体做法就是利用子查询,在构建临时表的时候,把rownum也一起构造进去。比如"select xx,yy from (select xx,yy,rownum as xyz from table where zz >20) where xyz between 10 and 20"这样就可以了。另外使用oracle提供的结果集处理函数minus也可以做到,例如"select xx,yy from table where zz > 20 and rownum <20 minus select xx,yy from table where zz>20 and rownum <10",但是使用minus好像比使用子查询更加消耗资源。

  和rownum相似,oracle还提供了另外一个伪数列:rowid。不过rowid和rownum不同,一般说来每一行数据对应的rowid是固定而且唯一的,在这一行数据存入数据库的时候就确定了。可以利用rowid来查询记录,而且通过rowid查询记录是查询速度最快的查询方法。(这个我没有试过,另外要记住一个长度在18位,而且没有太明显规律的字符串是一个很困难的事情,所以我个人认为利用rowid查询记录的实用性不是很大)rowid只有在表发生移动(比如表空间变化,数据导入/导出以后),才会发生变化。

转自:http://www.51testing.com/html/65/n-130765.html

转载于:https://www.cnblogs.com/junzhongxu/archive/2009/06/01/1493399.html

Oracle中查询rownum和rowid的区别相关推荐

  1. Oracle查询 rownum和rowid的区别

    在Oracle中,有一个很有趣的东西,那就是rownum.当你从某个表中查询数据的时候,返回的结果集中都会带有rownum这个字段,而且有时候也可以使用rownum进行一些条件查询. 在查询中,我们可 ...

  2. Oracle中的rownum和rowid

    --注意:rownum和rowid只有Oracle有,其它数据库是不支持的 select * from scott.dept; --查询的结果称为'结果集' --rownum 伪列 '结果集'中产生的 ...

  3. 转:Oracle中的rownum不能使用大于的问题

    标题:Oracle中的rownum不能使用大于>的问题 转自网络,稍做修改: 一.对rownum的说明 关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的"&g ...

  4. oracle中的rownum用法

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀 ...

  5. Oracle中rank() over, dense_rank(), row_number() 的区别

    Oracle中rank() over, dense_rank(), row_number() 的区别 假设现在有一张学生表student,学生表中有姓名.分数.课程编号,现在我需要按照课程对学生的成绩 ...

  6. Oracle中Null与空字符串''的区别

    http://read.newbooks.com.cn/info/172049.html Oracle中Null与空字符串''的区别 来源:CSDN   作者:jsjzzh   发布时间:2007-1 ...

  7. Oracle中sys和system用户的区别

    Oracle中sys和system用户的区别 1.数据库的启动需要以SYSDBA/SYSOPER身份登录. 2.如果在同一主机上使用IPC连接到数据库使用操作系统授权,登录任何一个用户都可以拥有as ...

  8. 【软件测试】Oracle中的rownum用法

    一.对rownum的说明 查看全文 http://www.taodudu.cc/news/show-3538609.html 相关文章: Oracle rownum 用法 Oracle rownum ...

  9. oracle数据库rank over用法,Oracle中rank() over, dense_rank(), row_number() 的区别

    Oracle中rank() over, dense_rank(), row_number() 的区别 假设现在有一张学生表student,学生表中有姓名.分数.课程编号,现在我需要按照课程对学生的成绩 ...

最新文章

  1. Apache OpenMeetings 5.0.0 发布:开源视频会议和协作系统
  2. You can Solve a Geometry Problem too(线段相交问题)
  3. .NET应用程序中异步调用Web Service的几种方法 come from: veryhappy(wx.net)
  4. 【渝粤题库】陕西师范大学165209 组织职业生涯管理 作业(专升本)
  5. jtree和mysql_java 已经获取某个mysql数据库的所有表名 创建JTree
  6. mysql 113_Centos 下 can't connect mysql server 113
  7. Android应用资源分析(老罗链接整理)
  8. 公司搞不好,除了坑股东,还坑的是客户
  9. c语言 数据结构面试题及答案,数据结构c语言版试题大全(含答案).docx
  10. 一种用于决策(decision-making)的系统架构
  11. 《愤怒的小鸟大电影》分析报告
  12. 软件工程——数据流图(DFD)
  13. 底部标签页+ViewPager+Fragment
  14. python复数的实部和虚部都是整数嘛_数字类型
  15. java游戏开局选宠物可以转职,创世之光人物资料及转职大全
  16. ACMjava杨辉三角形与二项式定理递推实现与组合实现
  17. 基于阿里云的块存储介绍
  18. VMWare安卓安卓系统虚拟机
  19. Win2008安装11g报错:orandce11.dll.dbl and orancds11.dll.dbl 文件找不到
  20. 案例分析——收尾工作

热门文章

  1. 基于VMware vSphere的虚拟化平台,内存分配是如何实现的?
  2. 对象存储 OSS > 开发指南 > 存储类型 > 存储类型介绍
  3. Windows2012R2版本区别
  4. Java基础学习总结(153)——HashMap、Hashtable、ConcurrentHashMap的原理与区别
  5. Java基础学习总结(42)——Log4j 2快速入门及Log4j 2 + Slf4j 的配置和使用
  6. 基 于 svm 的 图 像 分 类_CeO2和MgO助烧剂对矾土基莫来石合成料烧结的影响
  7. 用matlab画出TFT,基于Matlab的TFT-LCD解码电路的仿真设计(含程序)
  8. 游戏日志分析2:全方位数据采集
  9. Cmder 设置默认打开目录、解决中文乱码
  10. 基于node的登入例子(node-koa-mongoose)