rownum与rowid含义
oracle执行计划解释

oracle执行计划解释一.相关概念1·rowid,伪列:就是系统自己给加上的,每个表都有一个伪列,并不是物理存在。
它不能被修改,删除,和添加,rowid在该行的生命周期是唯一的,如果向数据库插入一列,只会引起行的变化,但是rowid并不会变。
2·recursive sql概念:当用户执行一些SQL语句时,会自动执行一些额外的语句,我们把这些额外的SQL语句称为“recursive calls” 或者是“recursive sql statement”,当在执行一个DDL语句时,Oracle总会隐含的发出一些Recursiv sql语句,用于修改数据字典,如果数据字典没有在共享内存中,则就执行“resursive calls”,它会把数据字典从物理读取到共享内存。
当然DML和select语句都可能引起recursive SQL。
3·row source 行源:在查询中,由上一操作返回的符合条件的数据集,它可能是整个表,也可能是部分,当然也可以对2个表进行连接操作(join)最后得到的数据集4·predicate:一个查询中的where限制条件5·driving table 驱动表:该表又成为外层表,这个感念用于内嵌和HASH连接中,如果返回数据较大,会有负面影响,返回行数据较小的适合做驱动表6·probed table 被探查表:该表又称为内层表,我们在外层表中取得一条数据,在该表中寻找符合连接的条件的行。
7·组合索引(concatenated index)由多个列组成的索引,在组合索引中有一个重要的概念,就是引导索引,create index idx_tab on tab(col1,col2,col3),indx_tab则称为组合索引,col1则称为引导列在查询条件where后,必须使用引导索引,才会使用该组合索引8.可选择性(selectivity)比较一下列中唯一键的数量和表中的行数,就可以判断该列的可选择性。
oracle中的rownum详解

oracle中的rownum详解1. 概述rownum是Oracle引⼊的虚列。
在物理上这个虚列并不存在,只是在查询时才构造出来。
伪列通常是⾃由分配的,⽤户⽆法执⾏修改等操作。
2. 特点关于rownum有以下主要特点:1)rownum不属于任何表。
2)rownum存在的前提,先有结果表。
3)rownum总是从1开始。
4)rownum⼀般只和<(<=)⼀起⽤。
5)使⽤rownum进⾏分页查询需要把rownum转化为实列,并针对rownum查询。
2. 机制原理rownum的⽤法看似奇怪,其实如果明⽩其机制原理就会很简单。
⾸先我们来做个简单的实验:从dual表中取出所有的字段,并取出rownum。
如果我们采⽤如下的写法:t.rownum这样运⾏就会报01747错:因为实际上,dual表就不存在rownum这个字段,所以我们⽆法使⽤t.rownum的格式。
正确的写法,应该是:所以,rownum是⼀个虚列,不属于任何表。
那么这虚列是怎么来的。
我们在做个简单的实验,便于理解:如下,我们有⼀个简单的表:test_ljb,共有⼗条记录。
我们加上rownum。
结果如下,很好理解,选出⼗条记录,rownum从1到10我们加上⼀个salary的筛选条件:结果如下:选出三条记录,rownum从1到3需要注意的是,第⼆个结果表的rownum对应的employee和第⼀张并不对应。
如:在第⼀张表rownum为1时,对应的时Arvin,⽽第⼆张对应的是Oracle。
原因如下:因为rownum是对结果集加的⼀个伪列,即先查到结果集之后再加上去的⼀个列。
简单的说,rownum是对符合条件结果的序列号。
它总是从1开始排起的,所以选出的结果不可能跳过1,⽽有其他⼤于1的值。
或者说,rownum是⼀个动态的,根据新的结果集实时变化的。
⽐如,如下语句:select t.*, rownum from test_ljb t where rownum >1; --⼤于2、3或者其他任何⼤于1的值,结果相同。
ORACLE数据库中Rownum用法详解

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条 为2,依次类 推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则 被删除, 接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
另外还要注意:rownum不能以任何基表的名称作为前缀。
到此这篇关于ORACLE数据库中ROWNUM用法详解的文章就介绍到这了,更多相关ORACLE数据库ROWNUM内容请搜索以 前的文章或继续浏览下面的相关文章希望大家以后多多支持!
有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像
1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢? 因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样 理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下 去也就只会显示前面9条记录了
对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),并非说用>,& gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要 理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样,下面以例子说明:
oracle rowid排序规则

一、什么是Oracle RowidOracle中的Rowid是一种用于唯一标识数据库表中行的物理位置区域。
每一行都有一个唯一的Rowid,可以通过该Rowid来直接访问该行,而不需要进行索引查找。
二、Rowid的结构Rowid是Oracle中的一个伪列,它由以下几部分组成:1. 数据对象号(Data Object Number):每个表在数据库中都有一个唯一的数据对象号,它由数据文件号和数据块号组成。
2. 行号(Row Number):每条记录在数据块中的相对位置。
3. 数据文件号(Data File Number):数据库中的每个数据文件都有唯一的编号。
4. 数据块号(Data Block Number):数据文件中的每个数据块都有唯一的编号。
三、Rowid的排序规则Rowid可以作为一种排序规则,可以通过Rowid来对表中的数据进行排序。
在Oracle中,Rowid有三种不同的格式:Extended Rowid、Urowid和Restricted Rowid。
每种格式都有对应的排序规则。
1. Extended Rowid排序规则:Extended Rowid是在大表中使用的Rowid格式,它的排序规则是按照数据对象号、数据块号和行号的顺序进行排序。
这种格式的Rowid可以唯一标识表中的每一条记录。
2. Urowid排序规则:Urowid是在索引中使用的Rowid格式,它的排序规则是按照数据对象号、数据文件号、数据块号和行号的顺序进行排序。
这种格式的Rowid可以唯一标识索引中的每一条记录。
3. Restricted Rowid排序规则:Restricted Rowid是在分区表中使用的Rowid格式,它的排序规则是按照数据对象号、数据文件号、数据块号、行号和分区号的顺序进行排序。
这种格式的Rowid可以唯一标识分区表中的每一条记录。
四、Rowid排序的应用场景Rowid排序可以用于优化查询性能。
rownum函数

rownum函数rownum数,在 Oracle据库中是一种主要的内置函数,它能够为任何用于从数据库中检索的查询提供行号。
ROWNUM用于 Oracle据库的每一行,而且有着多种应用。
它能够实现在查询中提取前几个行,跳过一段行,有效避免用户对于查询结果进行排序,从而提高 SQL询性能。
ROWNUM运行机理是将数据库中每一行作为一个号码,这样有助于将一个复杂的数据库表进行编号,便于进行管理和检索,提高了查询的效率和性能。
ROWNUM数具有三种类型的应用,即简单型,分段型和组合型。
简单型应用是在 Oracle 中常用的方式,它使用ROWNUM来限制结果。
比如,下面的SQL查询将只返回10行:SELECT * FROM table WHERE ROWNUM<=10;分段型应用则能够实现跳过一段行,然后从另一行读取后面的一些行。
比如,要跳过前 10,然后获取另外 10,可以使用下面的 SQL 句来实现:SELECT * FROM table WHERE ROWNUM BETWEEN 11 AND 20;组合型应用可以将简单型和分段型相结合,从而实现限定范围内的查询结果。
比如,要跳过前 10,然后获取后 5,就可以用下面的 SQL 句:SELECT * FROM table WHERE ROWNUM BETWEEN 11 AND 15;另外,ROWNUM可以用来实现排序。
比如,要对数据库表中所有行按照某个字段进行排序,就可以使用下面的 SQL句:SELECT * FROM table ORDER BY ROWNUM;此,就可以按照自己想要的顺序提取查询结果。
由于 ROWNUM数支持多种应用,因此,它也得到了越来越多的应用,尤其是在 SQL句中实现排序、范围查询等功能时。
ROWNUM数可以大大提高 SQL询的效率和性能,减少排序的负荷,从而更有效地节省系统资源。
总的来说,ROWNUM数是 Oracle据库中最重要的内置函数之一,它为大量的应用提供了极大的帮助,使得 Oracle据库实现了更高效率地检索和排序。
oracle SQL中rowid与rownum的使用

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的自然数)。
oracle中的rownum和rowid详解
综上几种情况,可能有时候需要查询rownum在某区间的数据,从上可以看出rownum对小于某值的查询条件是人为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的
让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然
3 200003 22 CCC
4 200004 22 DDD
5 200005 22 EEE
6 200006 22 AAA
SQL>select rownum ,id,age,name from loaddata order by name;
minus
select rownum,id,age,name from loaddata where rownum < 2
ROWNUM ID AGE NAME
------- ------ --- ------
2 200002 22 BBB
3 200003 22 CCC
ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200006 22 AAA
话,无法知道rownum是子查询的列还是主查询的列。
SQL>select rownum,id,age,name from(select rownum no ,id,age,name from loaddata) where no > 2;
ROWNUM ID AGE NAME
ROWNUM ID AGE NAME
Oracle中rownum 函数用法总结
Oracle中rownum用法总结对于Oracle 的rownum 问题,很多资料都说不支持>,>=,=,between……and,只能用以上符号(<、<=、!=),并非说用>,>=,=,between……and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与rowid 可有些不一样,下面以例子说明Examda提示: 假设某个表t1(c1)有20 条记录如果用select rownum,c1 from t1 where rownum < 10,只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。
可如果用select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一些记录,然后查看记录数,仍然是20 条啊?那问题是出在哪呢?先好好理解rownum 的意义吧。
因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(强调:先要有结果集)。
简单的说rownum 是对符合条件结果的序列号。
它总是从1开始排起的。
所以你选出的结果不可能没有1,而有其他大于1的值。
所以您没办法期望得到下面的结果集:11 aaaaaaaa12 bbbbbbb13 ccccccc……rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。
或者可以这样理解:ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。
它取得第一条记录则rownum值为1,第二条为2,依次类推。
Oracle中ROWID详解
Oracle中ROWID详解结论:oracle数据库的表中的每⼀⾏数据都有⼀个唯⼀的标识符,或者称为rowid,在oracle内部通常就是使⽤它来访问数据的。
rowid需要 10个字节的存储空间,并⽤18个字符来显⽰。
该值表明了该⾏在oracle数据库中的物理具体位置。
可以在⼀个查询中使⽤rowid来表明查询结果中包含该值。
已知:保存rowid需要10个字节或者是80个位⼆进制位。
这80个⼆进制位分别是:1. 数据对象编号,表明此⾏所属的数据库对象的编号,每个数据对象在数据库建⽴的时候都被唯⼀分配⼀个编号,并且此编号唯⼀。
数据对象编号占⽤⼤约32位,(6位显⽰)。
2. 对应⽂件编号,表明该⾏所在⽂件的编号,表空间的每⼀个⽂件标号都是唯⼀的。
⽂件编号所占⽤的位置是10位(3位显⽰)。
3. 块编号,表明改⾏所在⽂件的块的位置块编号需要22位(6位显⽰)。
4. ⾏编号,表明该⾏在⾏⽬录中的具体位置⾏编号需要16位(3位显⽰)。
这样加起来就是80位。
Oracle的物理扩展ROWID有18位,每位采⽤64位编码,分别⽤A~Z、a~z、0~9、+、/共64个字符表⽰。
A表⽰0,B表⽰1,……Z表⽰25,a表⽰26,……z表⽰51,0表⽰52,……,9表⽰61,+表⽰62,/表⽰63。
有:select rowid,id from dbamonitor.table1 where rownum < 20;ROWID ID------------------ ----------AAAbn2AAEAAAAh7AAB 2……AAAbn2AAEAAAAh7AAS 19AAAbn2AAEAAAAh7AAT 2019 rows selected.求:id=20对应rowid为 AAAbn2AAEAAAAh7AAT,根据rowid求该⾏在oracle数据库中的物理具体位置。
⽅式⼀:得出对象号为113142,⽂件号为4,块号2171,⾏编号19object# file# block# row#AAAbn2 AAE AAAAh7 AATobject#=AAAbn2=A(0)+A(0)+A(0)+b(27)*64*64+n(39)*64+2(54)=0+0+0+27*64*64+39*64+54=113142file#=AAE=A(0)+A(0)+E(4)=4block#=AAAAh7=A(0)+A(0)+A(0)+A(0)+h(33)*64+7(59)=33*64+59=2171row#=AAT=A(0)+A(0)+T(19)=19⽅式⼆:得出对象号为113142,⽂件号为4,块号2171,⾏编号19通过dbms_rowid包,可以直接得到具体的rowid包含的信息:SQL>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) row_number from dbamonitor.table1 where OBJECT_ID FILE_ID BLOCK_ID ROW_NUMBER---------- ---------- ---------- ----------11314242171191 row selected.注:desc命令查看表结构时,输出结果中是不能看到rowid这⾥⼀列的,这是因为这⼀列只在数据库内部使⽤,rowid通常被称为⼀个伪列。
rownum用法详解
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM <= N(抽出记录数)
ORDER BY ROWNUM ASC
下面举个例子简单说明一下。
顾客表customer(id,name)有如下数据:
1 200001 张一
2 200002 王二
查询rownum在某区间的数据,必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。
增加字段
alter table docdsp add dspcode char(200)
删除字段
ALTER TABLE table_NAME DROP COLUMN column_NAME
修改字段类型
ALTER TABLE table_name MODIFY column_name new_data_type
4 200004 赵四
可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询;
SQL> select rownum ,id,name from (select * from student order by name);
ID NAME
08 eighth
05 fifth
01 first
2.在TOP N纪录中抽出第M(M <= N)条记录
ROWNUM是记录表中数据编号的一个隐藏子段,所以可以在得到TOP N条记录的时候同时抽出记录的ROWNUM,然后再从这N条记录中抽取记录编号为M的记录,即使我们希望得到的结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首先来说一下rownum与rowid含义:顾名思义rownum就是行数/行号,而rowid就是编码/编号/唯一识别号,所以他是类似“AAAR8gAAEAAAAErAAK”的编号,注意他是没有先后顺序的,也就是说他和数据入库时间没有任何关系,打个比方:他就像磁盘、内存存储数据用的是16进制的地址一样。
他们都是伪列,可以理解成表中的一个列只是他们并不是你创建的。
同样是伪列区别是什么呢?rowid是你录入数据时有数据库自动为这条记录添加的唯一的18位编号是一个物理编号用于找到这条记录(顺便说一句这也是为什么数据优调的时候强调尽量使用rowid的原因),他是不会随着查询而改变的除非在表发生移动(比如表空间变化,数据导入/导出以后),才会发生变化。
rownum是根据sql查询后得到的结果自动加上去的,但是他却不受到sql中order by排序的影响,因为他和rowid的顺序一样是系统按照记录插入时的顺序给记录排的号(顺序的、无跳跃)。
但是如果你想让rownum和order by一样的顺序那么可以使用子查询,形如:select rownum,t.* from (select * from 表空间名 order by 字段名) t 这样的话rownum就是根据该字段进行排序的编号了,为什么会这样呢,本人理解:rownum是根据表记录输出的行号,与筛选语句、排序语句都无关所以当用子查询时等于生成了一个表于是就按照这张表从1开始排序了。
同样,也可以用下面要提得到的分析函数中的row_number() over(order by 需要排序的字段名)。
值得一提的是MSSQL是没有rownum和rowid的。
一,什么是伪列RowID?1,首先是一种数据类型,唯一标识一条记录物理位置的一个id,基于64位编码的18个字符显示。
2,未存储在表中,可以从表中查询,但不支持插入,更新,删除它们的值。
二,RowID的用途1,在开发中使用频率应该是挺多的,特别在一些update语句中使用更加频繁。
所以oracle ERP中大部份的视图都会加入rowid这个字段。
在一些cursor定义时也少不了加入rowid。
但往往我们在开发过程中,由于连接的表很多,再加上程序的复制,有时忽略了rowid对应的是那一个表中rowid,所以有时过程出错,往往发上很多时间去查错,最后查出来既然是update时带的rowid并非此表的rowid,所以在发现很多次的错误时,重视rowid起来了,开发中一定要注意rowid的匹配2,能以做快的方式访问表中的一行。
3,能显示表的行是如何存储的。
4,作为表中唯一标识。
三,RowID的组成rowid确定了每条记录是在Oracle中的哪一个数据对象,数据文件、块、行上。
ROWID 的格式如下:数据对象编号文件编号块编号行编号OOOOOO FFF BBBBBB RRR由 data_object_id# + rfile# + block# + row# 组成,占用10个bytes的空间, 32bit的 data_object_id#,10 bit 的 rfile#,22bit 的 block#,16 bit 的 row#.所以每个表空间不能超过1023个数据文件。
四,RowID的应用1,查找和删除重复记录当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。
/*conn scott/tigerCreate table empa as select * from emp;插入重复记录insert into empa select * from emp where empno = 7369;insert into empa select * from emp where empno = 7839;insert into empa select * from emp where empno = 7934;*/查找重复记录的几种方法:查找大量重复记录select empno from empa group by empno having count(*) >1;Select * From empa Where ROWID Not In(Select Min(ROWID) From empa Group By empno);查找少量重复记录select * from empa a where rowid<>(select max(rowid) from empa where empno=a.empno );删除重复记录的几种方法:(1).适用于有大量重复记录的情况(列上建有索引的时候,用以下语句效率会很高):Delete empa Where empno In (Select empno From empa Group By empno Having Count(*) > 1)And ROWID Not In (Select Min(ROWID) From empa Group By empno Having Count(*) > 1);Delete empa Where ROWID Not In(Select Min(ROWID) From empa Group By empno);(2).适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):Delete empa a where rowid<>(select max(rowid) from empa where empno=a.empno );---------------------------------------------------------------------------------------------------------------------------------------------------Oracle 的 rownum 问题注意:rownum从1开始;rownum按照记录插入时的顺序给记录排序,所以有order by的子句时一定要注意啊!使用时rownum,order by字段是否为主键有什么影响?子查询中rownum rn,而rn用到外查询中到底是怎样的序列?若id主键是按照从小到大的顺序插入的,select语句没有group by 和order by的子句时,rownum的顺序和id顺序基本一致。
对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<、<=、!=),并非说用>,& amp; gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid 可有些不一样,下面以例子说明假设某个表 t1(c1) 有 20 条记录如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。
可如果用 select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一些记录,然后查看记录数,仍然是 20 条啊?那问题是出在哪呢?先好好理解 rownum 的意义吧。
因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。
简单的说 rownum 是对符合条件结果的序列号。
它总是从1开始排起的。
所以你选出的结果不可能没有1,而有其他大于1的值。
所以您没办法期望得到下面的结果集:11 aaaaaaaa12 bbbbbbb13 ccccccc.................rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。
或者可以这样理解:ROWNUM 是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。
它取得第一条记录则rownum值为1,第二条为2,依次类推。
如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像1. select rownum,c1 from t1 where rownum != 10 为何是返回前9条数据呢?它与 select rownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。
也可以这样理解,rownum 为9后的记录的 rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了。
2. 为什么 rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却总显示所有的记录?因为 rownum 是在查询到的结果集后加上去的,它总是从1开始。
3. 为什么 between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果?原因同上一样,因为 rownum 总是从 1 开始。
从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的,少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1 。
但如果就是想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select *from (selet rownum as rn,t1.* from a where ...)where rn >10一般代码中对结果集进行分页就是这么干的。