Oracle查询语句中rownum与rowid的不同之处分析

来源:本网整理

rownum和rowid是两种不同的东西,不知道你如何利用rowid来分页?rownum是返回的

本文主要是以实例形式介绍了Oracle查询中rownum与rowid的不同之处,以及以假设的方式为例,查询条件为rownum = 2,在查询出第一条记录时的具体内容的介绍。

不对的:Oracle中的rownum的是在取数据的时候产生的序号,是在提取记录就已经生成,它先于排序

在查询中,我们可以注意到,类似于

  ORACLE 中ROWNUM用法总结!  对于 Oracle 的 rownum 问题,很多资

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则r

select xx from table where rownum < n (n>1)

rownum和rowid都是伪列,但是两者的根本是不同的:rownum是根据sql查询出的结果给

这样的查询是有正确含义的,而

首先我要跟题主探讨一个小问题您对上联的解释是,肚里无货怎能有所担当。您这里把“肚里无货”的意思在对联里说成“肚无典墨”是否有些不妥呢?因为有现成的成语啊:胸无点墨,就是说“肚里无货”的,比“肚无典墨”好听吧?所以说无论是作诗词还是对联,能引用成语,最好还是引用成语。成语言简意赅,耐人寻味。引用成语说话做文章,令人会高看一眼,认为此人知识丰富有阅历,哪怕是高考时同学的语文作文,答卷同学的文章里多用几个成语或是引用了典故,那么批卷老师也能多给2分。比那些牵强附会的,自己在那造词的同学受到的“待遇”可好多了。另外您的“声垂泪”,我也有点看不懂,“垂泪”是默默的流泪,“声”怎么解释?表现吗?还是声音。

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则r

select xx from table where rownum = n

首先,你需要了解AirJordan系列球鞋。1985年,迈克尔·乔丹以高薪合约被当时还是小厂家的体育用品生产商耐克签约至旗下,耐克更随即为乔丹推出了第一款以乔丹命名的球鞋,即空中飞人系列的第一款。虽然这款球鞋在当时具备奇特的配色以及新奇的科技,但是谁都不曾想到,这居然会是一个神话的开始。这次签约也改变了NIKE的命运以致整个运动产业的格局。从AirJordan第一代球鞋开始,到如今的AirJordan32代,AirJordan系列球鞋是目前球鞋领域里寿命最长的签名鞋系列,篮球之神迈克尔·乔丹的光辉在球鞋上得以延续。AirJordan系列球鞋在销量与市场需求方面遥遥领先于其它产品,每年为整个运动

这样的查询只在n=1的时候成立,

微信聊天记录删除了怎么恢复?微信是目前社会上工作群体使用最大的一款社交APP,很多的工作上的事情都会通过微信传递,所以它的聊天记录中会有一些重要的消息,如果不小心误删了要怎么恢复呢?想要找回微信误删的聊天记录,需要找到一款专业的苹果设备数据恢复工具---强力苹果恢复精灵,它能够帮助用户更快的找回误删的各种重要数据,下面就一起看看操作吧。苹果手机恢复微信聊天记录教程:准备工具:1)常用电脑2)需要恢复微信聊天记录的苹果手机、苹果数据线3)强力苹果恢复精灵开始恢复:1、使用iTunes软件对误删微信聊天记录的苹果手机进行相关的iTunes操作,随后打开电脑的浏览器搜索“强力苹果恢复精灵”,将软件下

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则r

select xx from table where rownum > n (n>1)

这样的查询只能得到一个空集。

另外

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则r

select xx from table where rownum > 0

这个查询会返回所有的记录。这是为什么呢?原因就在于Oracle对rownum的处理上,rownum是在得到结果集的时候产生的,用于标记结果集中结果顺序的一个字段,这个字段被称为“伪数列”,也就是事实上不存在的一个数列。它的特点是按顺序标记,而且是逐次递加的,换句话说就是只有有rownum=1的记录,才可能有rownum=2的记录。

让我们回头来分析一下在where中使用rownum作为Oracle查询条件的情况。在取rownum=1,或者rownum <= n (n>1)的时候,没有问题。那么为什么当条件为rownum = n或者rownum >= n时明明有数据却只能得到一个空集呢?假设我们的查询条件为rownum = 2,那么在查询出的第一条记录的时候,Oracle标记此条记录rownum为1,结果发现和rownum=2的条件不符,于是结果集为空。

假如有一条查询语句为

select xx,yy from table where zz > 20 and rownum < 10

那么在执行的时候,是先按照zz>20的条件查询出一个结果集,然后按照rownum取出前10条返回?还是在按照zz>20的条件先查询,然后有一个记录就标记一个rownum,到rownum<10的时候就停止查询?个人感觉应该是后者,也就是在执行语句的时候,不是做full scan,而是取够数据就停止查询。

要验证这个想法应该很简单,找一个数据量非常大的表进行Oracle查询就可以了。可惜目前我没有这样的表,有条件的读者可以自己测试一下。

我们可以看出,直接使用rownum是要受到限制的。但是很容易遇到这样的需求“查出符合条件的第xx条到第xx条记录”,比如页面的分页处理。这个时候如何构造出适合自己的结果集?

当然全取出来手工挑选也是可以的,但是前提是整个数据集的数据条数不多的情况下。假如遇到上十万百条的数据,全部取出来的话,用户就不用干别的事情了。这个时候用户应该怎么做呢?当然就是要用到我们介绍的rownum拉!rownum不是个“伪数列”么,好说,我们现在把它弄成一个实在的字段就可以了。

具体做法就是利用子Oracle查询,在构建临时表的时候,把rownum也一起构造进去。比如

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则r

select xx,yy from (select xx,yy,rownum as xyz from table where zz >20) where xyz between 10 and 20

这样就可以了。

另外使用Oracle提供的结果集处理函数minus也可以做到,例如

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则r

select xx,yy from table where zz > 20 and rownum <20 minus select xx,yy from table where zz>20 and rownum <10

但是使用minus好像比使用子查询更加消耗资源。

和rownum相似,Oracle还提供了另外一个伪数列:rowid。不过rowid和rownum不同,一般说来每一行数据对应的rowid是固定而且唯一的,在这一行数据存入数据库的时候就确定了。可以利用rowid来查询记录,而且通过rowidOracle查询记录是查询速度最快的查询方法。

对于这个我没有试过,另外要记住一个长度在18位,而且没有太明显规律的字符串是一个很困难的事情,所以我个人认为利用rowid查询记录的实用性不是很大。此外rowid只有在表发生移动(比如表空间变化,数据导入/导出以后),才会发生变化。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

oracle中rownum和rowid的区别

rownum和rowid都是伪列,但是两者的根本是不同的,rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录 ,

例如 AAAMgzAAEAAAAAgAAB 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30

这里的AAAMgzAAEAAAAAgAAB物理位置对应了这条记录,这个记录是不会随着sql的改变而改变。

因此,这就导致了他们的使用场景不同了,通常在sql分页时或是查找某一范围内的记录时,我们会使用rownum。

1、rownum

例如:

查找2到10范围内的记录(这里包括2和10的记录)

select *

from (select rownum rn, a.* from emp a) t

where t.rn between 2 and 10;

查找前三名的记录

select * from emp a where rownum < 3;这里我们要注意,直接用rownum查找的范围必须要包含1;因为rownum是从1开始记录的,当然你可以把rownum查出来后放在一个虚表中作为这个虚表的字段再根据条件查询。

例如:

select *

from (select rownum rn, a.* from emp a) t

where t.rn > 2;这就可以了

2、rowid

我们在处理一张表中重复记录时经常用到他,当然你也可以用一个很原始的方法,就是将有重复记录的表中的数据导到另外一张表中,最后再倒回去。

SQL>create table stu_tmp as select distinct* from stu;

SQL>truncate table sut; //清空表记录

SQL>insert into stu select * from stu_tmp; //将临时表中的数据添加回原表但是要是stu的表数据是百万级或是更大的千万级的,那这样的方法显然是不明智的,因此我们可以根据rowid来处理,rowid具有唯一性,查询时效率是很高的,

例如,学生表中的姓名会有重复的情况,但是学生的学号是不会重复的,如果我们要删除学生表中姓名重复只留学号最大的学生的记录,怎么办呢?

delete from stu a

where rowid not in (select max(rowid)

from stu b

where a.name = b.name

and a.stno < b.stno);

这样就可以了。

在Oracle中有个rowid和rownum,他们是一样的吗?有什么作用?大神求解!!!

  rowid和rownum都是伪列,但含义完全不同。rowid是物理地址,用于定位Oracle中具体数据的物理存储位置,而rownum则是sql的输出结果排序。通俗的讲:rowid是相对不变的,rownum会变化,尤其是使用order by的时候。

  rowid 用于定位数据表中某条数据的位置,是唯一的、也不会改变

  rownum 表示查询某条记录在整个结果集中的位置, 同一条记录查询条件不同对应的 rownum 是不同的而 rowid 是不会变的

oracle数据库中rowid和rownum有什么不同?

rowid在记录创建时就生成了,而且是不变的,直接指向硬件上的存储位置,能用rowid直接访问是最快的,但也是人力所无法做到的。rownum是个伪列,查询的时候除非特别指定,否则不会显示。其主要的用处是控制查询返回的行数,比如在WHERE中加ROWNUM<5,则查询结果如果在5行或以上时,只返回前4行。

请问oracle的行标识符rowid与行号rownum有什么区别?

rowid的组成是这样

SQL> select rowid from rowid_example;

ROWID

------------------

AAANdqAABAAAPFyAAA

其中,

AAANdq AAB AAAPFy AAA

Data Object ID Relative File No Block Number Row Number(Slot)

也就是由对象id,相关的文件id,块号,行号共同构成了唯一的一行的定位符。类似于物理地址

rownum则是逻辑上的。查询结果的顺序号。比如

SQL> select rowid,rownum from a;

ROWID ROWNUM

------------------ ----------

AAAP9VAAEAAAK4nAAA 1

AAAP9VAAEAAAK4nAAB 2

AAAP9VAAEAAAK4nAAC 3

AAAP9VAAEAAAK4nAAD 4

AAAP9VAAEAAAK4nAAE 5

AAAP9VAAEAAAK4nAAF 6

AAAP9VAAEAAAK4nAAG 7

AAAP9VAAEAAAK4nAAH 8

8 rows selected.

前面的ROWID是查询出来的该行记录的唯一地址,后面的rownum则是此次查询结果的序号。

oracle数据库之中sql语句的问题~~关于 rownum和 rowid

这个应该说是oracle给出的错误信息不够明确,

rowid是保留关键字,而你的主查询里面用了*,子查询里面有rowid,

给rowid取别名的话oracle就能正确处理了。

  • 本文相关:
  • ORACLE 毫秒与日期的相互转换示例
  • Oracle 获得以百分号结尾的脚本有三种写法
  • ORACLE查看并修改最大连接数的具体步骤
  • 查看oracle数据库的编码及修改编码格式的方法
  • Oracle 11G密码180天过期后的修改方法
  • oracle 11g的警告日志和监听日志的删除方法
  • oracle更新xml节点问题的一些细节
  • Oracle定义DES加密解密及MD5加密函数示例
  • 使用工具 plsqldev将Excel导入Oracle数据库
  • oracle查看被锁的表和被锁的进程以及杀掉这个进程
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved