oracle获取rowid,在Oracle里面查询rowid以及rownum之间的区别

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

cbd9820f89d5a3cd8d835a7823eb9291.png

一、原因分析

不知道大家是否有留意到一点,那就是在查询里面,有一些类似于“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之间的区别,希望这对大家有所帮助。课课家会一直更新关于编程语言的文章,请继续关注我们的网站:课课家教育。谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值