因为ROWNUM是对结果集加的一个伪列。比如:结果集为:
a
b
c
d
e
f
g你的ROWNUM如果是<>4则加了
1 a
2 b
3 c
后,d的rownum为4,则去掉。
去掉后e的rownum为4,则去掉。
如此下去,就只剩前3个了。这也就是为什么rownum>=2没有记录了,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。
a
b
c
d
e
f
g你的ROWNUM如果是<>4则加了
1 a
2 b
3 c
后,d的rownum为4,则去掉。
去掉后e的rownum为4,则去掉。
如此下去,就只剩前3个了。这也就是为什么rownum>=2没有记录了,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。
已就是要先有结果集,所以不能用的
select * from emp where rownum>=1 and rownum<10
............
所以你选出的结果不可能没有1,而有其他大于1的值。所以如果想要这个结果的话要用嵌套语句,把rownum先生成,然后对他进行查询。
select *
from(selet rownum rn,a.* from a where ...)
where rn>=10
它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
因此ROWNUM>=1 AND ROWNUM<=10是可以查到前10条记录但是不能证明
ROWNUM>=500 AND ROWNUM<=600可以查处500~600的501条记录。
ROWNUM>=1 AND ROWNUM<=10在逻辑上相当于ROWNUM<=10
如果要用大于的可以这样做:
select * from (select s.*, rownum row_id from table s where rownum<1000001) where row_id>999990;