Oracle查询 rownum和rowid的区别

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

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

【 tulaoshi.com - 编程语言 】

  在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的记录。

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

  让我们回头来分析一下在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,而是取够数据就停止查询。要验证这个想法应该很简单,找一个数据量非常大的表进行查询就可以了。可惜目前我没有这样的表。

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

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

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

来源:http://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...
打开通用查询日志:记录所有查询日志.该日志路经默认在/var/lib/mysql下.名字默认为"机器名.log" vi /etc/my.cnf [mysqld] ... log ... 打开慢查询日志: 记录所有慢查询日志(该例阀门为2秒). vi /etc/my.cnf [mysqld] ... log-slow-queries = /var/log/mysqlslowquery.log long_qu...
标签: 化妆水
油性皮肤使用紧肤水;健康皮肤使用爽肤水;干性皮肤使用柔肤水;对混合皮肤来说,T字部位使用紧肤水,其它部位使用柔肤水和爽肤水皆可。 化妆水和爽肤水的区别-爽肤水和柔肤水的区别 化妆水和爽肤水的区别 爽肤水、柔肤水、收敛水统称化妆水,是一种透明液态的化妆品,涂抹在皮肤的表面,用来清洁肌肤、保持肌肤的健康。爽...
6.5.1 什么是会话 会话(Session)是Oracle数据库服务器对连接数据库的用户进行记录的一种手段。 6.5.2 会话有什么内容 (1)如图6.11所示的会话界面。如果数据库会话很多,显示的将是使用数据库例程资源的前几个会话。 (2)在里可以设置显示会话的方法。 (3)单击按钮按照任何所选的会话统计信息排序。 ...
标签: 养生 健康
所谓干型葡萄酒(干白、干红)仅指葡萄酒中含糖量的多少,并没有其他的含义。按照标准的规定,干型葡萄酒的含糖量在4.0g/L以下。由于这种类型的酒含糖量低,没有甜味,所以更多地表现出葡萄的果香、发酵产生的酒香和陈酿留下的醇香。传统意义上的葡萄酒都是甜型葡萄酒,含糖量都在50.0g/L以上。 干红葡萄酒的“干”是从香Tulaoshi.Com槟...

经验教程

281

收藏

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