如何正确利用Rownum来限制查询所返回的行数?

来源:互联网 发布:淘宝首页报名 编辑:程序博客网 时间:2024/05/21 05:18

含义解释:      
  1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,    
      依此类推,这个伪字段可以用于限制查询返回的总行数。    
  2、rownum不能以任何基表的名称作为前缀。      
  使用方法:      
  现有一个商品销售表sale,表结构为:    
  month      char(6)        --月份    
  sell    number(10,2)   --月销售金额    
   
  create   table   sale   (month   char(6),sell   number);    
  insert   into   sale   values('200001',1000);    
  insert   into   sale   values('200002',1100);    
  insert   into   sale   values('200003',1200);    
  insert   into   sale   values('200004',1300);    
  insert   into   sale   values('200005',1400);    
  insert   into   sale   values('200006',1500);    
  insert   into   sale   values('200007',1600);    
  insert   into   sale   values('200101',1100);    
  insert   into   sale   values('200202',1200);    
  insert   into   sale   values('200301',1300);    
  insert   into   sale   values('200008',1000);    
  commit;    
   
  SQL>   select   rownum,month,sell   from   sale   where   rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)    
   
        ROWNUM   MONTH               SELL    
  ---------   ------   ---------    
                  1   200001             1000    
   
  SQL>   select   rownum,month,sell   from   sale   where   rownum=2;(1以上都查不到记录)    
   
  没有查到记录    
   
  SQL>   select   rownum,month,sell   from   sale   where   rownum>5;    
  (由于rownum是一个总是从1开始的伪列,Oracle   认为这种条件不成立,查不到记录)    
   
   
  没有查到记录    
   
  只返回前3条纪录    
  SQL>   select   rownum,month,sell   from   sale   where   rownum<4;    
   
        ROWNUM   MONTH               SELL    
  ---------   ------   ---------    
                  1   200001             1000    
                  2   200002             1100    
                  3   200003             1200    
   
   
  如何用rownum实现大于、小于逻辑?(返回rownum在4—10之间的数据)(minus操作,速度会受影响)    
  SQL>   select   rownum,month,sell   from   sale   where   rownum<10    
      2     minus    
      3     select   rownum,month,sell   from   sale   where   rownum<5;    
   
        ROWNUM   MONTH               SELL    
  ---------   ------   ---------    
                  5   200005             1400    
                  6   200006             1500    
                  7   200007             1600    
                  8   200101             1100    
                  9   200202             1200    
   
  想按日期排序,并且用rownum标出正确序号(有小到大)    
  SQL>   select   rownum,month,sell   from   sale   order   by   month;    
   
        ROWNUM   MONTH               SELL    
  ---------   ------   ---------    
                  1   200001             1000    
                  2   200002             1100    
                  3   200003             1200    
                  4   200004             1300    
                  5   200005             1400    
                  6   200006             1500    
                  7   200007             1600    
                11   200008             1000    
                  8   200101             1100    
                  9   200202             1200    
                10   200301             1300    
   
  查询到11记录.    
   
  可以发现,rownum并没有实现我们的意图,系统是按照记录入库时的顺序给记录排的号,rowid也是顺序分配的    
   
  SQL>   select   rowid,rownum,month,sell   from   sale   order   by   rowid;    
   
  ROWID                                   ROWNUM   MONTH               SELL    
  ------------------   ---------   ------   ---------    
  000000E4.0000.0002                   1   200001             1000    
  000000E4.0001.0002                   2   200002             1100    
  000000E4.0002.0002                   3   200003             1200    
  000000E4.0003.0002                   4   200004             1300    
  000000E4.0004.0002                   5   200005             1400    
  000000E4.0005.0002                   6   200006             1500    
  000000E4.0006.0002                   7   200007             1600    
  000000E4.0007.0002                   8   200101             1100    
  000000E4.0008.0002                   9   200202             1200    
  000000E4.0009.0002                 10   200301             1300    
  000000E4.000A.0002                 11   200008             1000    
   
  查询到11记录.    
   
  正确用法,使用子查询    
  SQL>   select   rownum,month,sell   from   (select   month,sell   from   sale   group   by   month,sell)   where   rownum<13;    
   
        ROWNUM   MONTH               SELL    
  ---------   ------   ---------    
                  1   200001             1000    
                  2   200002             1100    
                  3   200003             1200    
                  4   200004             1300    
                  5   200005             1400    
                  6   200006             1500    
                  7   200007             1600    
                  8   200008             1000    
                  9   200101             1100    
                10   200202             1200    
                11   200301             1300    
   
  按销售金额排序,并且用rownum标出正确序号(有小到大)    
  SQL>   select   rownum,month,sell   from   (select   sell,month   from   sale   group   by   sell,month)   where   rownum<13;    
   
        ROWNUM   MONTH               SELL    
  ---------   ------   ---------    
                  1   200001             1000    
                  2   200008             1000    
                  3   200002             1100    
                  4   200101             1100    
                  5   200003             1200    
                  6   200202             1200    
                  7   200004             1300    
                  8   200301             1300    
                  9   200005             1400    
                10   200006             1500    
                11   200007             1600    
   
  查询到11记录.    
   
  利用以上方法,如在打印报表时,想在查出的数据中自动加上行号,就可以利用rownum。    
   
  返回第5—9条纪录,按月份排序    
  SQL>   select   *   from   (select   rownum   row_id   ,month,sell      
      2     from   (select   month,sell   from   sale   group   by   month,sell))      
      3     where   row_id   between   5   and   9;    
   
          ROW_ID   MONTH                 SELL    
  ----------   ------   ----------    
                    5   200005               1400    
                    6   200006               1500    
                    7   200007               1600    
                    8   200008               1000    
                    9   200101               1100  

原创粉丝点击