Oracle查询 rownum和rowid的区别

恩恩恩恩80

恩恩恩恩80

2016-02-19 18:33

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐Oracle查询 rownum和rowid的区别,无聊中的都看过来。

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

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

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  我们可以看出,直接使用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 zz20 and rownum 10”,但是使用minus好像比使用子查询更加消耗资源。

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

Oracle查询 rownum和rowid的区别

编程语言 网络编程
Oracle查询 rownum和rowid的区别

Oracle中Truncate和Delete的区别

编程语言 网络编程
Oracle中Truncate和Delete的区别

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

MySQL数据库和oracle的区别和选择

编程语言 网络编程
MySQL数据库和oracle的区别和选择

Oracle中spfile和pfile间区别和联系

编程语言 网络编程
Oracle中spfile和pfile间区别和联系

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Oracle临时表 优化查询速度

编程语言 网络编程
Oracle临时表 优化查询速度

在Oracle中实现搜索分页查询

编程语言 网络编程
在Oracle中实现搜索分页查询

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

CSS样式表中SPAN和DIV的区别

CSS样式表中SPAN和DIV的区别

常用css缩略语

常用css缩略语
下拉加载更多内容 ↓