有了以上从不同方面建立起来的对
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
一般代码中对结果集进行分页就是这么干的。
另外:rowid
与
rownum
虽都被称为伪列,但它们的存在方式是不一样的,rowid
可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid
相对于表来说又像表中的一般列,所以以
rowid
为条件就不会有
rownum那些情况发生。
另外还要注意:rownum不能以任何基表的名称作为前缀。
oracle的rownum是在提取记录就已经生成,它先于排序 *** 作,所以必须使用子查询先排序
。
ROWNUM值的分配是在查询的谓词解析之后,任何排序和聚合之前进行的。
oracle 中的 rownum 是伪列,不属于某一张表。对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
所以它更不是表中的第一列。
Oracle提供了一个rownum的伪列,它会根据返回记录生成一个序列化的数字。rownum和rowid都是伪列,但是两者的根本是不同的。rownum是根据SQL查询出的结果给每行分配一个逻辑编号,所以SQL不同也就会导致最终rownum不同;rowid是物理结构上的,在每条记录INSERT到数据库中时,都会有一个唯一的物理记录。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)