下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

在Oracle里面查询rowid以及rownum之间的区别

作者:课课家教育     来源: http://www.kokojia.com点击数:2054发布时间: 2017-02-27 16:00:05

标签: 数据库数据表查询记录

大神带你学编程,欢迎选课

  Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的适应高吞吐量的数据库解决方案。今天小编要为大家分享的一篇教程,在Oracle里面查询rowid以及rownum之间的区别。

在Oracle里面查询rowid以及rownum之间的区别_数据库_数据表_查询记录_课课家

  一、原因分析

  不知道大家是否有留意到一点,那就是在查询里面,有一些类似于“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的这一个条件是不相符的,于是结果集(结果集是对象包含符合SQL语句中条件的所有行集合)就会为空。

  二、有趣想法

  教程写到这里,小编突然之间就有一个想法,这个想法还是比较有趣的。就比如说现在有一条查询语句是这样子的:select xx,yy from table where zz > 20 and rownum < 10,那么大家在执行时,首先是先按照zz>20这样的条件查询出一个结果集,接下来大家就按照rownum获取得到前面10条返回?又或者是再按照zz>20的条件先查询,接下来有一个记录就开始标记一个rownum,到rownum<10时就停止查询呢?对此,相信每一个人都有自己不同的做法吧。但是在这里,小编就认为应该是后者的操作,换句话说也就是在执行语句时,不是做fullscan,然而是获取够数据就停止查询。如果大家想要验证这一个想法,其实应该是非常简单的。前提我们就需要寻找一个数据量很大很大的数据表进行查询即可,问题就是小编现在并没有这样的数据表,表示非常的遗憾哟。

  看到这里相信大多数人都可以看出一点,那就是直接使用rownum这是要受到限制的。但是非常容易遇到这样的需求“查出符合条件的第xx条到第xx条记录”,就比如说页面的分页(将一个页面分成两个或两个以上的页面)处理。此时问题就来了?究竟怎样才可以构造出适合自己的结果集呢?假如有人说使用全取出来手工挑选的方法进行实现,好吧那你自己进行操作吧。不是说这样子的做法不可以,当然啦这样子操作肯定是可以的,但是有一个大前提,那就是整一个数据集的数据条数不多的情况下可以进行。如果当大家遇到了上十万百条的数据的时候,将所有的数据都取出来的话,那么小编相信用户就不用做其他的事情了。此时大家应该怎么做才是最好的方法呢?当然啦,这就是需要使用到小编刚刚介绍到的rownum了!刚刚小编已经说了rownum是一个“伪数列”,那么我们现在就将其制作成为一个实实在在的字段(数据库中最基本的存储单元,它的位置要由这个表中的记录和字段来定义)即可。

  三、操作步骤

  具体的操作步骤其实也是非常简单的,只需要执行以下的操作就可以了。具体操作如下:在这里我们就需要使用子查询,在构建临时数据表时,将rownum也一起构造进去。就比如说“select xx,yy from (select xx,yy, row num as x y z from table where zz>20)where x y z between 10 and 20”这样子就可以了。除此之外,大家还需要使用oracle为我们提供的结果集处理函数minus,这样子也可以做到。现在小编就举一个例子来说明吧,就比如说select xx,yy from table where zz > 20 and rownum < 10,,但是使用minus就好像比使用子查询更加的消耗资源了,所以小编并不推荐哟。

  和rownum相类似,oracle还为我们提供了另外一个伪数列(按一定次序排列的一列数称为数列),那就是rowid。不过在这里大家要注意了,那就是rownum和rowid两者之间是不一样的。一般情况下,每一行数据所对应的rowid是固定并且还是唯一的,那么只需要在这一行数据存入数据库时就已经确定了。另外一个方面,大家还可以利用rowid来进行查询记录,除此之外通过rowid进行查询记录,这是查询速度最快最方便的查询方法。(但是这一个方法小编并没有尝试过,另外一个方面大家还需要记住一点,那就是一个长度在18位,而且没有太明显规律的字符串,这是一件非常困难的事情,所以我个人认为利用rowid查询记录的实用性不是很大)rowid只有在表发生移动(比如表空间变化,数据导入/导出以后),才会发生变化。

  小编结语:

  今天的编程语言教程,小编就已经介绍完毕了,主要是向大家介绍一下在Oracle里面查询rowid以及rownum之间的区别,希望这对大家有所帮助。课课家会一直更新关于编程语言的文章,请继续关注我们的网站:课课家教育。谢谢!

赞(22)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程