oracle SQL中rowid与rownum的使用

合集下载

Oracle中rownum的使用

Oracle中rownum的使用

标题:Oracle中的rownum不能使用大于>的问题转自网络,稍做修改:一、对rownum的说明关于Oracle 的rownum 问题,很多资料都说不支持SQL语句中的“>、>=、=、between...and”运算符,只能用如下运算符号“<、<=、!=”,并非说用“>、>=、=、between..and”时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来。

其实,只要理解好了这个rownum 伪列的意义就不应该感到惊奇。

rowid 与rownum 虽都被称为伪列,但它们的存在方式是不一样的:rowid 是物理存在的,表示记录在表空间中的唯一位置ID,在DB中是唯一的。

只要记录没被搬动过,rowid是不变的。

rowid 相对于表来说又像表中的一般列,所以,以rowid 为条件就不会有rownum那些莫名其妙的结果出现。

另外还要注意:rownum不能以任何基表的名称作为前缀。

对于下面的SQL语句SQL>select rownum,id,age,name from loaddata where rownum > 2;ROWNUM ID AGE NAME------- ------ --- ------rownum>2,没有查询到任何记录。

因为rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。

依此类推,所以永远没有满足条件的记录。

可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。

它取得第一条记录则rownum值为1,第二条为2。

依次类推。

当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。

下条的rownum还会是1,又被删除,依次类推,便没有了数据。

oracle rowid排序规则

oracle rowid排序规则

oracle rowid排序规则摘要:1.简介2.Oracle Rowid 的作用3.Oracle Rowid 的排序规则4.总结正文:1.简介Oracle 数据库是一种关系型数据库管理系统,广泛应用于各种企业和组织的数据存储和管理。

在Oracle 数据库中,Rowid 是一个用于唯一标识表中每一行的元数据,类似于身份证号,具有唯一性。

Rowid 对于数据库性能优化和数据查询具有重要意义。

本文将详细介绍Oracle Rowid 的排序规则。

2.Oracle Rowid 的作用Oracle Rowid 主要用于以下几个方面:(1)唯一标识表中的每一行数据。

(2)在数据库复制和数据移动过程中,作为源数据和目标数据之间的映射。

(3)在数据库连接和会话管理中,作为识别不同会话的依据。

(4)在分布式数据库环境中,作为协调不同节点之间数据访问的标识。

3.Oracle Rowid 的排序规则Oracle Rowid 的排序规则主要遵循以下几点:(1)在同一行数据中,Rowid 是单调递增的。

也就是说,当一条数据被更新或者插入时,它的Rowid 会比之前的Rowid 大。

(2)不同行的Rowid 之间没有固定的顺序。

也就是说,Rowid 之间不能直接比较大小,不能用Rowid 来对数据进行排序。

(3)Rowid 的生成方式有多种,包括基于行号、基于时间戳、基于分布式事务ID 等。

不同的生成方式可能影响Rowid 的排序规则。

(4)在某些特定场景下,例如在使用数据库连接池时,Oracle 会为连接池中的每个连接分配一个唯一的Rowid,以区分不同的连接。

4.总结Oracle Rowid 是数据库中非常重要的元数据,用于唯一标识表中的每一行数据。

虽然Rowid 具有单调递增的特性,但它不能直接用于数据排序。

在实际应用中,需要根据业务需求选择合适的排序方式。

oracle中rowid的用法

oracle中rowid的用法

oracle中rowid的用法Oracle数据库中的ROWID,是由Oracle内部用来唯一标识一行数据的一种方式。

在Oracle数据库的某些操作中,使用ROWID可以帮助我们更快速准确的访问和处理数据。

下面将详细介绍ROWID的用法和应用场景。

一、ROWID的使用方法1.基本方法:在SQL中使用ROWID查询在SQL中,通过查询语句直接使用ROWID来定位数据行。

例如:SELECT * FROM table WHERE ROWID='AAAR3u'+3gAAAQ7AAA';注意:需要使用单引号将ROWID的值括起来,并在其前面加上'AAAR3u'+3gAAAQ7AAA'。

这是由于ROWID值含有特殊字符,所以需要进行转义。

2. DML 操作ROWID也可以用于 UPDATE、DELETE 操作中,将其作为 WHERE 子句的条件。

例如:UPDATE table SET column1=value WHEREROWID='AAAR3u'+3gAAAQ7AAA';二、ROWID应用场景1. 存储大量的数据当存储大量数据时,ROWID可用于更快地定位和处理数据。

在这种情况下,我们可以利用 ROWID 执行快速和有效的操作。

在进行大量数据的操作时,ROWID 可以按照最小的 I/O 开销进行访问。

2. 分区表当使用分区表时,ROWID可用于确定特定的数据行是否属于某个特定的分区。

在存在多个分区的情况下,我们可以使用 ROWID 快速找到特定分区中的数据行。

3. 高速查询在某些情况下,ROWID也可以帮助我们实现高速查询,尤其在有大量数据行的表中,使用 ROWID 和基于 ROWID 的索引,可以更快速准确的检索到数据。

总结在Oracle数据库中,ROWID是一种唯一标识一行数据的方式,我们可以通过在SQL中使用ROWID来定位或处理数据。

row_number用法(一)

row_number用法(一)

row_number用法(一)row_number函数的用法详解1. row_number函数的概述row_number是一种在SQL语句中使用的用于产生连续行号的窗口函数。

它为查询结果集中的每一行分配一个唯一的行号。

2. row_number函数的语法row_number的语法如下:row_number() over ( [partition by column1, column2, ...] [order by column [asc/desc], ...] )其中: - partition by子句可选,用于在行号分配时根据指定的列进行分区。

- order by子句可选,用于指定按照哪些列进行排序,默认按照查询结果集的顺序排序。

3. row_number函数与分区不使用分区的情况如果不使用partition by子句,row_number函数将为整个查询结果集生成连续的行号。

示例如下:SELECT column1, column2, ..., row_number() over () AS row_numFROM table_name;使用分区的情况如果使用partition by子句,将按照指定的分区列对查询结果集进行分区,每个分区内的行将形成独立的序列。

示例如下:SELECT column1, column2, ..., row_number() over (pa rtition by partition_column) AS row_numFROM table_name;4. row_number函数与排序默认排序方式如果不指定order by子句,则row_number函数将按照查询结果集的顺序为行分配行号。

示例如下:SELECT column1, column2, ..., row_number() over () AS row_numFROM table_name;指定排序列和排序方式通过order by子句,可以指定按照哪些列进行排序以及排序的方式(升序或降序)。

oracle中rownum和row_number()的使用方法以及区别和联系

oracle中rownum和row_number()的使用方法以及区别和联系

oracle中rownum和row_number()的使⽤⽅法以及区别和联系此⽂章是引⽤他⼈的⽂章,⾮⾃⼰原创,只是为了做个记录,写的特别详细,今天⼯作碰到的问题,看了这篇⽂章得到解决了。

应该保存下来。

所以引⽤。

这个是引⽤的地址,https:///article/65960.htm。

这篇⽂章主要介绍了oracle中rownum和row_number()的使⽤⽅法以及区别和联系,⼗分的详细,有需要的⼩伙伴可以参考下。

row_number()over(partition by col1 order by col2)表⽰根据col1分组,在分组内部根据col2排序,⽽此函数计算的值就表⽰每组内部排序后的顺序编号(组内连续的唯⼀的)。

与rownum的区别在于:使⽤rownum进⾏排序的时候是先对结果集加⼊伪劣rownum然后再进⾏排序,⽽row_number()在包含排序从句后是先排序再计算⾏号码。

⼀、oracle中rownum⽤于从查询返回的⾏的编号,返回的第⼀⾏分配的是1,第⼆⾏是2,依此类推,这个伪字段可以⽤于限制查询返回的总⾏数,⽽且rownum 不能以任何表的名称作为前缀。

1、rownum 对于等于某值的查询条件如果希望找到学⽣表中第⼀条学⽣的信息,可以使⽤rownum=1作为条件。

但是想找到学⽣表中第⼆条学⽣的信息,使⽤rownum=2结果查不到数据。

因为rownum都是从1开始,但是1以上的⾃然数在rownum做等于判断是时认为都是false条件,所以⽆法查到rownum = n(n>1的⾃然数)。

SQL> select rownum,id,name from student where rownum=1; --有记录SQL> select rownum,id,name from student where rownum =2; --⽆记录2、rownum对于⼤于某值的查询条件如果想找到从第⼆⾏记录以后的记录,当使⽤rownum>2是查不出记录的,可以使⽤以下的⼦查询⽅法来解决。

row_number用法

row_number用法

row_number用法它的语法是:其中,[PARTITION BY column_list]是可选的,用于指定数据分割的列,这样数据将会被分成多个分区。

如果不指定该参数,则整个数据集将作为一个分区。

[ORDER BY column_list [ASC , DESC]]也是可选的,用于指定数据排序的列。

如果不指定该参数,则行号将按照数据的现有顺序分配。

使用row_number(函数,你可以为每行记录生成一个唯一的行号,从1开始递增,在一个窗口中,每当遇到一个新分区或者排序值发生变化时,行号将会重新开始计数。

下面是一个使用row_number(函数的示例:SELECT column1, column2, row_number( OVER (ORDER BY column1) as row_numFROM table_name这个查询将在table_name表中的每一行记录后面,生成一个列名为row_num的新列,包含该记录在整个数据集中的行号。

1.分组行号:使用PARTITIONBY子句将数据分成多个分组,并对每个分组进行行号分配。

这在需要为每个分组中的记录进行排序或排名时非常有用。

2.排名:通过组合row_number(函数和ORDER BY子句,可以对数据集进行排序,并为每个记录分配排名。

例如,可以使用row_number(函数找到销售额最高的产品,或者基于一些指标进行排名。

3.分页:结合row_number(函数和分页查询,可以非常方便地执行分页操作。

例如,可以使用row_number(函数将数据集分配行号,并使用WHERE子句选择指定的行号范围。

4.去重:可以使用row_number(函数找到重复的记录,并为它们分配行号。

这样,你就可以很容易地删除重复记录,或者根据行号进行聚合和分析。

需要注意的是,row_number(函数生成的行号是基于物理位置进行计算的,并不依赖于表中的任何具体列。

所以,不同查询的结果可能会导致不同的行号分配。

oracle 数据库查询前十条语句

一、引言在进行数据库查询时,查询前十条数据是一个常见的需求。

无论是在开发中调试程序,还是在生产环境下排查问题,查询前十条数据都是非常有用的。

本文将介绍如何使用Oracle数据库进行查询前十条数据的方法。

二、使用ROWNUM进行查询在Oracle数据库中,可以使用ROWNUM来实现查询前十条数据的功能。

ROWNUM是Oracle中的一个伪列,它表示返回的结果集中行的行号。

可以通过ROWNUM来筛选出前十条数据。

1. 查询语句示例```sqlSELECT * FROM table_name WHERE ROWNUM <= 10;```2. 示例解释上面的查询语句中,通过使用ROWNUM来筛选出行号小于等于10的数据,即返回前十条数据。

3. 注意事项在使用ROWNUM进行查询时,需要注意以下几点:- ROWNUM是在结果集返回之后才分配的行号,因此必须在WHERE 子句中使用它进行筛选,否则会得到不符合预期的结果。

- 当查询语句中包含ORDER BY子句时,需要先对数据进行排序,然后再使用ROWNUM进行筛选。

三、使用子查询进行查询除了使用ROWNUM进行查询外,还可以通过子查询的方式来实现查询前十条数据的功能。

1. 查询语句示例```sqlSELECT * FROM (SELECT * FROM table_name ORDER BY column_name) WHERE ROWNUM <= 10;```2. 示例解释上面的查询语句中,首先对数据进行排序,然后再使用ROWNUM进行筛选,返回排在前十位的数据。

3. 注意事项使用子查询进行查询前十条数据时,需要注意以下几点:- 子查询的结果集是一个临时表,因此可以在外层查询中对其进行进一步的筛选和排序。

- 在子查询中可以通过ORDER BY进行排序,然后在外层查询中使用ROWNUM进行筛选。

四、使用FETCH FIRST进行查询在Oracle 12c及以上的版本中,可以使用FETCH FIRST来实现查询前十条数据的功能。

oracle里面的rowid用法

oracle里面的rowid用法Rowid是Oracle数据库中的一个特殊数据类型,用于唯一标识数据库表中的每一行数据。

它可以被用于定位和操作特定的记录,尤其在处理大量数据时很有用。

本文将详细介绍Oracle中的rowid用法。

一、什么是rowid?Rowid是Oracle数据库中的一个伪列,它是一个唯一的标识符,用于唯一地标识数据库表中的每一行。

它由多个部分组成,包括文件号、块号、行号等信息,用于定位和访问存储在数据库中的数据。

二、rowid的结构Rowid由几个关键部分组成,包括数据对象号(data object number, DON)、文件号(file number)、块号(block number)、行号(row number)等。

其格式如下:CC.DDDDD其中,AAAA代表数据对象号,占4个字节;BBBB代表文件号,占4个字节;CCCC代表块号,占4个字节;DDDDD代表行号,占6个字节。

三、rowid的生成方式Oracle数据库会为每个数据块中的记录分配一个唯一的rowid。

rowid的生成方式主要有以下两种:1. 物理行标识符(Physical Row Identifier, Prid):物理行标识符是Oracle数据库生成的默认行标识符,它是唯一的,不可修改,且在记录被删除后,不会再被使用。

2. 逻辑行标识符(Logical Row Identifier, Lrid):逻辑行标识符是Oracle数据库在特定情况下生成的行标识符,例如在使用索引访问表时,数据库会生成逻辑行标识符来提高查询效率。

四、rowid的用法Rowid在Oracle数据库中有着广泛的应用,主要用于以下几个方面:1. 定位数据:通过rowid可以准确定位和访问数据库表中的某一行。

例如,可以使用rowid来快速定位特定的记录,或者将rowid作为查询条件来进行数据检索。

2. 数据修改:rowid也可以用于对数据库表进行数据修改。

ora3_3

15
二.有关视图的操作 视图是一种特殊的表,是建立在基表上的虚表,是基表 的一个数据窗口,通过视图可对表中数据操作,是实现对数据 的保密及数据的安全性的一种手段。视图的基本操作包括视 图建立及通过视图对数据库表的查询、增加、删除等操作. 1.创建视图命令 SQL>create view <视图名>[(<视图列名表>)] as <select 语句> [with check option] 对所建视图中各列名的指定: 列名出现的顺序、个数与select命令中出现的列名顺序, 个数相对应,若不指出视图列名,则与select命令中所指定 的表的列名相同。命令中有with选项,通过视图向表作插入 ,修改的数据必须满足视图定义中查询子句指定的条件。
2.多层嵌套查询 在查询命令中,where子句中可含有任意多个子查询作主 查询条件, 它们可用 and,or 连接构成复合条件, 或 再相互嵌 套, 组成多层嵌套。 例1.找出10号部门中与销售部门中任何职工工种相同的雇员。 SQL> select ename, job from emp where deptno=10 and job IN ( select job from emp where deptno=(select deptno from dept where dname=’SALES’) );
8
§3.4 SQL语言中函数的使用 SQL语言提供了种类丰富的功能函数,对函数概念同一般的 高级程序设计语言。 在集函数使用中,经常涉及到空值。空值不是数值0,也不是 字符值“空格”,是无什么值,不占任何存储空间。对于空值 在 比较运算、算术运算及大部分集函数中,都不计入,并切空值与 任何数值进行运算结果为空,有时根据需要,需空值参加运算, 且代表一定的值,则要用到空值函数 NVL,对空值赋予值。 NVL(<列名>,<值>) 例:对30号部门进行几项统计 SQL> select avg(NVL(comm,0)),avg(sal+NVL(comm,0)), sum(sal+NVL(comm,0)) from emp where deptno=30;

【转载】oracle之rowid详解

【转载】oracle之rowid详解本⽂讨论的是关于oracle从8i开始引进object的概念后的rowid,即扩展(extended)的rowid:1. rowid的介绍先对rowid有个感官认识:SQL>select ROWID from Bruce_test where rownum<2;ROWID ------------------ ---------- AAABnlAAFAAAAAPAAA ROWID的格式如下:数据对象编号⽂件编号块编号⾏编号 OOOOOO FFF BBBBBB RRR我们可以看出,从上⾯的rowid可以得知: AAABnl 是数据对象编号 AAF是相关⽂件编号 AAAAAP是块编号 AAA 是⾏编号怎么依据这些编号得到具体的⼗进制的编码值呢,这是经常遇到的问题。

这⾥需要明⽩rowid的是基于64位编码的18个字符显⽰(数据对象编号(6) +⽂件编号(3) +块编号(6)+⾏编号(3)=18位),其中 A-Z <==> 0 - 25 (26) a-z <==> 26 - 51 (26) 0-9 <==> 52 - 61 (10) +/ <==> 62 - 63 (2)共64位,明⽩这个后,就可以计算出10进制的编码值,计算公式如下: d * (b ^ p) 其中:b就是基数,这⾥就是64,p就是从右到左,已0开始的位置数⽐如:上⾯的例⼦⽂件号AAF,具体的计算应该是: 5*(64^0)=5; 0*(64^1)=0; 0*(64^2)=0;⽂件号就是0+0+5=5 刚才提到的是rowid的显⽰⽅式:基于64位编码的18个字符显⽰,其实rowid的存储⽅式是:10 个字节即80位存储,其中数据对象编号需要32 位,相关⽂件编号需要10 位,块编号需要22,位⾏编号需要16 位,由此,我们可以得出: 32bit的object number,每个最多有4G个对象 10bit的file number,每个对象最多有1022个⽂件(2个⽂件预留) 22bit的block number,每个⽂件最多有4M个BLOCK 16bit的row number,每个BLOCK最多有64K个ROWS2. rowid相关的有⽤的sql最简单的基于rowid的显⽰⽅式得到的响应的64位编码对应值的sql:select rowid , substr(rowid,1,6) "OBJECT", substr(rowid,7,3) "FILE", substr(rowid,10,6) "BLOCK", substr(rowid,16,3) "ROW" from TableName;OWID OBJECT FILE BLOCK ROW ------------------ ------------ ------ ------------ ------ AAABc4AADAAAGLUAAA AAABc4 AAD AAAGLU AAAAAABc4AADAAAGLUAAB AAABc4 AAD AAAGLU AAB AAABc4AADAAAGLUAAC AAABc4 AAD AAAGLU AAC AAABc4AADAAAGLUAAD AAABc4AAD AAAGLU AAD AAABc4AADAAAGLUAAE AAABc4 AAD AAAGLU AAE通过dbms_rowid这个包,可以直接的得到具体的rowid包含的信息:select dbms_rowid.rowid_object(rowid) object_id, dbms_rowid.rowid_relative_fno(rowid) file_id, dbms_rowid.rowid_block_number(rowid) block_id ,dbms_rowid.rowid_row_number(rowid) num from bruce_t where rownum<5; OBJECT_ID FILE_ID BLOCK_ID NUM ---------- ---------- ---------- ---------- 5944 3 25300 0 5944 3 25300 1 5944 3 25300 25944 3 25300 3⼀些使⽤ROWID的函数 ROWIDTOCHAR(rowid) :将ROWID转换成STRING CHARTOROWID('rowid_string') :将STRING转换成ROWID另外,就是⾃⼰写的⼀些函数:(下⾯的函数是⽹友eygle提供)create or replace function get_rowid(l_rowid in varchar2) return varchar2is ls_my_rowid varchar2(200); rowid_type number; object_number number; relative_fno number; block_number number; row_number number; begin dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number); ls_my_rowid :='Object# is :'||to_char(object_number)||chr(10)||'Relative_fno is :'||to_char(relative_fno)||chr(10)||应⽤上⾯的函数如下: SQL>select get_rowid(rowid), name from bruce_t;GET_ROWID(ROWID) NAME-------------------------------------------------------------------------------- -------------------------------- Object# is :5944 BruceLau Relative_fno is:3 Block number is :25300 Row number is :0 Object# is:5944 MabelTang Relative_fno is :3 Block number is :25300 Row number is:1ROWID: ROWID为该表⾏的唯⼀标识,是⼀个伪列,可以⽤在SELECT中,但不可以⽤INSERT, UPDATE来修改该值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.ROWNUM的使用——TOP-N分析使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM。

ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(强调:先要有结果集)。

简单的说ROWNUM是符合条件结果的序列号。

它总是从1开始排起的。

使用ROWNUM时,只能使用<、<=、!=符号。

举例:student(学生)表,表结构为:ID char(6)--学号name V ARCHAR2(10)--姓名--建表create table student (ID char(6), name V ARCHAR2(10));--添加测试记录insert into student values('200001','张一');insert into student values('200002','王二');insert into student values('200003','李三');insert into student values('200004','赵四');commit;--测试SQL> select * from student;ID NAME------ ------------------------200001 张一200002 王二200003 李三200004 赵四⑴rownum 对于等于某值的查询条件如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。

但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。

因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

SQL> select rownum,id,name from student where rownum=1;ROWNUM ID NAME---------- ------ ---------------------------------------------------1 200001 张一SQL> select rownum,id,name from student where rownum =2;未选定行⑵rownum对于大于某值的查询条件如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

SQL> select rownum,id,name from student where rownum >2;未选定行那如何才能找到第二行以后的记录呢?可以使用子查询方法来解决。

注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

SQL>select * from(select rownum no ,id,name from student) where no>2;NO ID NAME---------- ------ ---------------------------------------------------3 200003 李三4 200004 赵四SQL> select * from(select rownum,id,name from student)where rownum>2;未选定行⑶rownum对于小于某值的查询条件如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。

显然rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。

SQL> select rownum,id,name from student where rownum <3;ROWNUM ID NAME-------------------- ------ ---------------------------------------------------1 200001 张一2 200002 王二综上几种情况,可能有时候需要查询rownum在某区间的数据,可以看出rownum对小于某值的查询条件是为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。

那就必须使用子查询。

例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们可以写以下语句,先让它返回小于等于3的记录行,然后在主查询中判断新的rownum的别名列大于等于2的记录行。

但是这样的操作会在大数据集中影响速度。

SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;NO ID NAME---------- ------ ---------------------------------------------------2 200002 王二3 200003 李三⑷rownum和排序Oracle中的rownum是在取数据的时候产生的序号,所以想对指定排序的数据指定rowmun行数据就必须注意了。

SQL> select rownum ,id,name from student order by name;ROWNUM ID NAME---------- ------ ---------------------------------------------------3 200003 李三2 200002 王二1 200001 张一4 200004 赵四可以看出,rownum并不是按照name列来生成的序号。

系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。

为了解决这个问题,必须使用子查询SQL> select rownum ,id,name from (select * from student order by name);ROWNUM ID NAME---------- ------ ---------------------------------------------------1 200003 李三2 200002 王二3 200001 张一4 200004 赵四这样就成了按name排序,并且用rownum标出正确序号(由小到大)。

order by name 如果name是主键或有索引,查询出来的rownum完全按照1,2,3.....的次序。

SQL> alter table student add constraint pk_stu primary key(name);SQL> select rownum ,id,name from student order by name;ROWNUM ID NAME---------- ------ ---------------------------------------------------1 200003 李三2 200002 王二3 200001 张一4 200004 赵四2. ROWID的使用——快速删除重复的记录ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。

ROWID可以分为物理rowid和逻辑rowid两种。

普通的表中的rowid是物理rowid,索引组织表(IOT)的rowid是逻辑rowid。

当表中有大量重复数据时,可以使用ROWID快速删除重复的记录。

举例:--建表tblSQL> create table stu(no number,name varchar2(10),sex char(2));--添加测试记录SQL> insert into stu values(1, 'ab',’男’);SQL> insert into stu values(1, 'bb',’女’);SQL> insert into stu values(1, 'ab',’男’);SQL> insert into stu values(1, 'ab',’男’);SQL>commit;删除重复记录方法很多,列出两种。

⑴通过创建临时表可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:SQL>create table stu_tmp as select distinct* from stu;SQL>truncate table sut; //清空表记录SQL>insert into stu select * from stu_tmp; //将临时表中的数据添加回原表这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。

⑵利用rowid结合max或min函数使用rowid快速唯一确定重复行结合max或min函数来实现删除重复行。

SQL>delete from stu a where rowid not in (select max(b.rowid) from stu b where a.no=b.no and = and a.sex = b.sex);//这里max使用min也可以或者用下面的语句SQL>delete from stu a where rowid < (select max(b.rowid) from stu b where a.no=b.no and = and a.sex = b.sex);//这里如果把max换成min的话,前面的where子句中需要把"<"改为">"跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。

SQL>delete from stu where rowid not in (select max(rowid) from stu t group by t.no, , t.sex );思考:若在stu表中唯一确定任意一行数据(1, 'ab',’男’),把sex字段更新为”女”,怎么做?SQL>update stu set sex=’女’where rowid=(select min(rowid) from stu where no=1 and name=’ab’ and sex=’男’);oracle伪列rowid和rownum一,什么是伪列RowID?1,首先是一种数据类型,唯一标识一条记录物理位置的一个id,基于64位编码的18个字符显示。

相关文档
最新文档