1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,
依此类推,这个伪字段可以用于限制查询返回的总行数。
2、rownum不能以任何基表的名称作为前缀。
select id,rownum from employee;(在id列上有一个主键索引)
为了完成这个查询,优化器执行一个全索引扫描(主键索引),后跟一个count操作生成每个行的rownum值,
count操作不需要等待得到整个记录集,随着从employee表中返回记录,rownum计数器进行增量,从而确
定每个记录的rownum.
select id,rownum from employee where rownum<10;
为了实施限定条件,优化器用count stopkey操作代替count操作,它将rownum伪列的增量值与限定
条件中指定的值进行比较,如果rownum伪列的值大于限定条件中指定的值,则查询不再返回更多的行!
注意:在where 子句中不能使用 rownum>10这样的操作,只能使用rownum<10这样的操作!
系统是按照记录入库时的顺序给记录排的号,rowid也是顺序分配的
SQL> select rownum,month,sell from sale where rownum=2;(1以上都查不到记录)
SQL> select rownum,month,sell from sale where rownum>5;
(由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件不成立,查不到记录)
如何用rownum实现大于、小于逻辑?(返回rownum在4—10之间的数据)
1. minus操作(速度会受影响)
select rownum,month,sell from sale where rownum<10
minus
select rownum,month,sell from sale where rownum<5;
2. 嵌套查询(rownum要取别名)
SELECT r, juchu_no
FROM (SELECT ROWNUM r, juchu_no
FROM ht_d_juchu
ORDER BY juchu_no)
WHERE r BETWEEN 4 AND 10
注意:
当每一个满足where条件的row被fetch出来,则rownum赋值。但是order by clause是在所有行都fetch出来以后才进行的,此时rownum值在order by以前已经全部都有值。此时再order by, rownum不一定有序了。可以再嵌套一层。
取20条记录,然后再 order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询 来实现先排序,后
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"
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23445793/viewspace-630868/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23445793/viewspace-630868/