网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.数据库管理:Oracle 缓冲区忙等待.
.linux 下oracle9i的安装.
.高速的导出/导入:Oracle Data P.
.Oracle rac安装过程详解(十).
.在REDHAD LINUX 9 下安装ORACLE .
.比较SQL Server2005和Oracle 10g.
.Oracle 9i 在AIX上的安装.
.加速PL/SQL过程.
.在Oracle中实现数据库的复制.
.Original: How to duplicate da.
.实例讲解Oracle数据库自动增加ID.
.ORA-00701 warmstarting对象的另.
.解决ora-01034:oracle not avail.
.Oracle中实现数据迁移和数据共享.
.Oracle起动库时1102报错处理.
.oracle学习个人总结.
.PL/SQL中用光标查询多条记录.
.教你快速掌握一个简单的Oracle定.
.Oracle创造Linux平台TPC-C测试纪.
.如何使用exp以传输表空间的方式将.

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

发表日期:2008-2-9



如何正确利用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


上一篇:Oracle分布式系统数据复制技术 人气:496
下一篇:Installing Oracle 10g on RHEL AS 3 Step-by-Step 人气:497
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐