中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > Oracle
教你利用Rownum来限制查询所返回的行数
作者:changelive 时间:2007-06-20 16:14 出处:ccidnet.com 责编:月夜寒箫
              摘要:教你利用Rownum来限制查询所返回的行数

本文通过个人经验来客观的讲述如何利用Rownum来限制查询所返回的行数。

软件环境: 

1、Windows NT4.0+ORACLE 8.0.4。

2、ORACLE安装路径为:C:\ORANT。

含义解释: 

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
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有