Rownum来限制查询所返回的行数

含义解释:      
  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  

Oracle 据库中,如果限制查询返回行数,可以使用以下几种方法: ### 方法一:ROWNUM 伪列 这是最经典也是最早支持的方式之一。通过 ROWNUM 可以直接控制返回的记录目。 #### 示例: ```sql SELECT * FROM employees WHERE ROWNUM <= 10; ``` 这将只返回 `employees` 表中的前十条记录。 不过要注意的是,ROWNUM 在生成新一行之前就进行了评估,所以它会影响排序后的结果集。如果你想要先按某个字段排序再截前几项的话,你要结合子查询一起完成: ```sql SELECT * FROM ( SELECT * FROM employees ORDER BY salary DESC ) WHERE ROWNUM <= 5; ``` ### 方法二:FETCH FIRST N ROWS ONLY (自 Oracle 12c 开始引入) 这是一个更直观、易于理解的方式来获头若干条据,并且能够很好地配合 ORDER BY 使用而不会丢失预期顺序。 #### 示例: ```sql SELECT * FROM employees ORDER BY hire_date ASC FETCH FIRST 10 ROWS ONLY; ``` 此命令确保按照雇佣日期升序排列之后选最早的十名雇员。 ### 方法三:利用分析函(Analytical Functions) 有候我们还要基于某些特定业务逻辑来挑选符合条件的部分样本,在这种场景下就可以采用窗口功能提供的强大能力了。 例如,如果我们想找到每个部门工资最高的前三个人,则可以用如下脚本实现: ```sql SELECT employee_id, department_id, last_name, salary, DENSE_RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) as rnk FROM employees; -- 然后再过滤掉排名大于3的人即可得到最终答案。 SELECT * FROM previous_query_results WHERE rnk <= 3; ``` 以上就是三种常用的限制查询结果集中行数量的技术手段啦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值