关于rownum

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不一定有序了。可以再嵌套一层。

“select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便
取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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值