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

转载 2007年10月08日 17:05:00
1rownumoracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是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实现大于、小于逻辑?(返回rownum4—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来限制查询所返回的行数?

软件环境:   1、Windows NT4.0+ORACLE 8.0.4  2、ORACLE安装路径为:C:\ORANT  含义解释:   1、rownum是oracle系统顺序分配为从查...
  • zhongshaoguo
  • zhongshaoguo
  • 2013年12月26日 17:03
  • 463

优化使用ROWNUM进行分页查询的SQL

使用ROWNUM进行web页面分页查询的SQL写法,需要使用性能好的语法,性能差别非常大!...
  • youyonghu001
  • youyonghu001
  • 2015年04月21日 14:50
  • 961

mysql中RowNum的实现

MySQL 几乎模拟了 Oracle,SQL Server等商业数据库的大部分功能,函数。但很可惜,到目前的版本(5.1.33)为止,仍没有实现ROWNUM这个功能。   下面介绍几种具体的实现方...
  • yibing548
  • yibing548
  • 2015年05月05日 17:30
  • 12889

Sqlite3查询指定行数数据

Sqlite3查询指定行数数据  (2010-11-01 11:12:49) 转载▼ 标签:  it 分类: 数据库 Sqlit...
  • chenrunhua
  • chenrunhua
  • 2016年01月18日 16:48
  • 4232

ORACLE和SYBASE数据库中实现数据查询条数限制的SQL语句实现

一、概述 对于某些需要通过数据库与大量数据打交道的软件来说,处理性能相当的重要。为了保证软件能够将所有数据处理完而不至于崩溃,分批处理的思想应运而生。分批处理的具体做法是编写SQL语句,每次返回规定...
  • zhouzxi
  • zhouzxi
  • 2015年05月18日 18:50
  • 2664

ORACLE——ROWNUM解析(使用ROWNUM大于条件,无法得到任何查询结果)

标题:Oracle中的rownum不能使用大于>的问题 转自网络,稍做修改: 一、对rownum的说明    关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中...
  • jQuerys
  • jQuerys
  • 2016年09月04日 15:41
  • 2439

oracle exists子查询出现rownum引起性能问题的优化

生产环境中有一支SQL消耗cpu资源很大,逻辑读为299361,相关问题描述: Rationale The SQL spent 100% of its database time on CPU, I/...
  • zengxuewen2045
  • zengxuewen2045
  • 2016年09月24日 14:01
  • 754

ThinkPHP获取带条件数据总条数(行数)

ThinkPHP的Model.class.php里有count方法,但是并不能传入where条件,只能得到整个表的数据行数,这就给我带来一些不便了,比如我想根据一些条件来查询数据并做分页显示...
  • wangzuxi
  • wangzuxi
  • 2015年04月29日 19:52
  • 6936

使用 row_number 获取实际返回行的行号

最近在做一个比较复杂的项目,其中用来排序的条件比较多,于是只能使用 row_number 函数进行排序,但是使用一次 row_number 之后得到的行号并不符合实际工作中的需要,需要根据这个排序之后...
  • superwfei
  • superwfei
  • 2016年05月18日 18:01
  • 1454

Sqlite3的简单用法,得到行数和列值【附源码和文件】

测试环境:VC6.0 代码走起: #include #include #pragma comment(lib,"sqlite3.lib")2 #include "sqlite3.h" vo...
  • u013100446
  • u013100446
  • 2014年12月30日 18:59
  • 3353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何正确利用Rownum来限制查询所返回的行数
举报原因:
原因补充:

(最多只允许输入30个字)