Oracle查询 rownum和rowid的区别

2016-02-19 18:33 1 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

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

  在查询中,我们可以注意到,类似于“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://www.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://www.tulaoshi.com/n/20160219/1618136.html

延伸阅读
小儿痢疾和腹泻的区别 大便性状:开始与腹泻一样 小儿痢疾和腹泻的区别,根据大便性状看,小儿痢疾开始时像普通腹泻一样,大便多为水样,伴有呕吐,之后,大便次数会增多,但大便量却在减少,性状也改变为黏液并带血丝,有较重的臭味等; 但是一般的腹泻是大便次数多,并且大便量也多,也会伴有发烧呕吐,但是粪便呈黄绿色,带粘液且呈蛋花汤样...
标签: Web开发
What is "this"? In many object-oriented programming languages, this (or self) is a keyword which can be used in instance methods to refer to the object on which the currently executing method has been invoked. 代码如下: $("#textbox").hover( function() { this.title = "Test"; }, fucntion() { this.title = "OK...
6.5.1 什么是会话 会话(Session)是Oracle数据库服务器对连接数据库的用户进行记录的一种手段。 6.5.2 会话有什么内容 (1)如图6.11所示的会话界面。如果数据库会话很多,显示的将是使用数据库例程资源的前几个会话。 (2)在里可以设置显示会话的方法。 (3)单击按钮按照任何所选的会话统计信息排序。 ...
正在看的ORACLE教程是:Oracle对两个数据表交集的查询。 Oracle关系型数据库管理系统是世界上流行的关系数据库,它是一个极其强大、灵活和复杂的系统,据说,在使用oracle时应有这样的思想,那就是在SQL中几乎可以实现任何一种想法。 下面向大家介绍使用SQL查两个Oracle数据表查询的相同数据的方法,笔者感到这两种方法执行效率高、使用方...
标签: 化妆水
油性皮肤使用紧肤水;健康皮肤使用爽肤水;干性皮肤使用柔肤水;对混合皮肤来说,T字部位使用紧肤水,其它部位使用柔肤水和爽肤水皆可。 化妆水和爽肤水的区别-爽肤水和柔肤水的区别 化妆水和爽肤水的区别 爽肤水、柔肤水、收敛水统称化妆水,是一种透明液态的化妆品,涂抹在皮肤的表面,用来清洁肌肤、保持肌肤的健康。爽...

经验教程

307

收藏

82
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部