如何正确利用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: ROWNUM DOES NOT ORDER

Oracle 提供称之为 Rownum 的特性, 对于一个查询返回的每一个记录,  ROWNUM 返回一个数字用来表示顺序. 该列表并不是排序的.

SQL> select username,rownum from dba_users order by username;

USERNAME                      ROWNUM

--------------------------    ------

AURORA$ORB$UNAUTHENTICATED         6

CTXSYS                            10

DBSNMP                             4

MDSYS                              9

OPS$ORACLE                         5

ORDPLUGINS                         8

ORDSYS                             7

OUTLN                              3

SYS                                1

SYSTEM                             2

TESTUSER                          11

11 rows selected.

使用 ORDER BY 没有解决问题, 因为 Rownum 在记录排序之前已经应用. 下面是一个需要返回一个基本表前面三个记录的例子.

select username,rownum from dba_users

where rownum < 4 order by username;

USERNAME                      ROWNUM

--------------------------    ------

OUTLN                              3

SYS                                1

SYSTEM                             2

------------

Tim Quinlan

mysql rownum groupby_如何正确利用Rownum来限制查询所返回的行数?相关推荐

  1. 【mysql快速入门】牛客网:查询所有列查询多列查询结果去重查询结构返回限制行数将查询后的列重新命名

    题目:现在运营想要查看用户信息表中所有的数据,请你取出相应结果 示例:user_profile id device_id gender age university province 1 2138 m ...

  2. mysql之返回影响行数

    mysql更新数据,这里我提出一个问题: 当mysql更新的时候,这一条数据已经被删除了?那怎么办?会提示更新失败吗? 现在开始现场实验 ExecuteNonQuery 这个函数可以返回影响的行数,如 ...

  3. [MySQL] - 返回影响行数

    (在MySQL 5.1.36上测试) found_rows() : select row_count()  : insert update delete 注:需要配合相应的操作一起使用,否则返回的值只 ...

  4. mysql返回行数_如何计算MySQL查询返回的行数?

    How can I count the number of rows that a MySQL query returned? 解决方案 Getting total rows in a query r ...

  5. java操作MySQL数据库(插入、删除、修改、查询、获取所有行数)

    插播一段广告哈:我之前共享了两个自己写的小应用,见这篇博客百度地图开发的两个应用源码共享(Android版),没想到有人找我来做毕设了,年前交付,时间不是很紧,大概了解了下就接下了,主要用到的就是和服 ...

  6. mysql sql%rowcount_sql%rowcount 返回影响行数

    从零3D基础入门XNA 4.0(1)--3D开发基础 [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入 ...

  7. mysql 存储过程(提供查询语句并返回查询执行影响的行数)

    DELIMITER $$ DROP PROCEDURE IF EXISTS `p_get_select_row_number`$$ CREATEPROCEDURE `test_cases`.`p_ge ...

  8. MySQL存储过程之查询受影响的行数与查询到的行数

    FOUND_ROWS() : select 查询擦操作 ROW_COUNT() : update delete insert.  增删改操作

  9. java 利用POI 读取Excel数据的真实有效行数

    前言 最近发现java导入excel数据时,我的excel数据明明只有4条数据,可是java程序却读取到了第6行.检查代码发现5.6行不小心设置了行高,导致poi的getLastRowNum()方法读 ...

最新文章

  1. 修改sms_def的MOF文件收集网络共享信息
  2. 函数 php_PHP函数缺陷详解
  3. 接收对象数组_示例: Bit数组
  4. active英语怎么读音_必须收藏!英语48个音标发音(附详细图解+视频教程)
  5. 关于purge master logs的一个小实验
  6. Java程序员的推荐阅读书籍
  7. m1芯片Mac安装jekyll+搭建GitHub pages个人博客站点
  8. es集群节点数和分片数关系_ES数据插入和查询流程是怎么样的?
  9. android:ellipsize省略文字用法(转载)
  10. GitHub 的 12 个实用技巧,你 get 了几个?
  11. linux中更改用户密码_如何在Linux中更改用户密码
  12. Eclipse手动添加dtd文件使xml能自动提示
  13. windows 无法完成格式化_U盘无法格式化
  14. 墙里秋千墙外道。墙外行人,墙里佳人笑。笑渐不闻声渐悄。多情却被无情恼。
  15. 运动控制器多工位位置比较输出在转盘式视觉筛选设备中的应用
  16. java集合入门和深入学习,看这篇就差不多了
  17. Start Developing Mac Apps -- 开始开发Mac应用
  18. 指针进阶之字符指针(超详细)
  19. crm虚拟服务器搭建,搭建CRM服务器
  20. 超级计算器 - 网易出品的数学好助手

热门文章

  1. 10款idea神级插件,生产力必备神器!
  2. mysql 留存率_mysql查询用户留存语法(用户留存和用户留存率问题)
  3. 计算机论文图表,核心方法:自动生成毕业论文标题目录和图表目录的方法
  4. EXCEL2010数据挖掘插件 下载地址
  5. workbench设置单元坐标系_节点坐标系:很多Workbench结构用户不知道的重要概念
  6. Deepin 20 外接显示器配置
  7. 我最有用的IntelliJ IDEA键盘快捷键
  8. 诺基亚(Nokia)E7-00联通定制版移动上网的方法(暴力推荐)
  9. java中gui_java中GUI是什么意思?详细图解
  10. 【转】SetThreadLocale解决越南文乱码问题