如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于号,
查出来的结果很容易与一般理解在概念上达成一致,不会有任何疑问。
可如果用 select rownum,c1 from t1 where rownum > 10 你就会发现,显示出来的结果并不会如你所愿
先理解 Oracle rownum 的意义。
ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。
简单的说 rownum 是对符合条件结果的序列号。总是从1开始排起。所以选出的结果不可能没有1而有其他大于1的值。
1. select rownum,c1 from t1 where rownum != 10 总是返回前9条数据。
2. rownum >1 时查不到一条记录,而 rownum >0 或 rownum >=1 却能显示所有的记录
3. between 1 and 10 或者 between 0 and 10 能查到结果,而用 between 2 and 10 却得不到结果原因同上一样,
从上可以看出,任何时候想把 rownum = 1 这条记录抛弃是不对的,它在结果集中是不可或缺的。
少了rownum=1 就像空中楼阁一般不能存在,所以你的 rownum 条件要包含到 1。
如果想用 rownum > 10 这种条件的话话就要用嵌套语句,把 Oracle rownum 先生成,然后对他进行查询。
- select *
- from (selet rownum as rn,t1.* from a where ……)
- where rn >10
一般代码中对结果集进行分页就是这么干的。
另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的。
rowid 是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。
另外还要注意:
1, rownum不能以任何基表的名称作为前缀。
2,子查询中的rownum必须要有别名,否则还是不会查出记录来。
3,查询rownum在某区间的数据,必须使用子查询。