rownum详解

来源:互联网 发布:linux抓取80数据包 编辑:程序博客网 时间:2024/04/29 02:46

ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1。
现在列举以下例子,
1、加深理解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

2、oracle 分页:
想要用 rownum > 10 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select *
from (selet rownum as rn,t1.* from a where ...)
where rn >10

3、rowid与rownum的理解:
rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一

位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件

就不会有 rownum那些情况发生。

4、rownum 对于等于或者大于某值的查询条件
(1)如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用

rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以

无法查到rownum = n(n>1的自然数)。例如:
select * from( select rownum as rn,t.* from user_info t )where rn=2
但是注意:子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话

,无法知道ownum是子查询的列还是主查询的列

5、
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据取指定的rowmun行数据就必须注意
6、
select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便取20条

记录,然后再order by,只能用子查询来实现先排序,后rownum,方法如下:
"select * from (select * from tabname order by name) where rownum<20",但这样一来,效率会低很多。
只需在order by 的字段上加主键或索引即可让oracle先按该字段排序,然后再rownum;方法不变:    “select * from

tabname where rownum<20 order by name"