rownum是Oracle对查询结果进行顺序编号,第一行分配1,第二行2,以此类推。rownum不能以任何表的名称作为前缀。

rownum这个伪字段可以用于控制返回的记录行数。

例如表:student(学生)表,表结构为:

ID       char(6)      --学号
name    VARCHAR2(10)   --姓名
create table student (ID char(6), name VARCHAR2(100));
insert into sale values('',‘张一’);
insert into sale values('',‘王二’);
insert into sale values('',‘李三’);
insert into sale values('',‘赵四’);
commit;

1. rownum对于等于某值的查询:

查询第一条学生的信息,可以使用rownum=1作为条件,但第二条不能用rownum=2来查询。

因为rownum都是从1开始,但1以上的自然数在rownum做等于判断是时都是false的,所以无法查到rownum = n(n>1的自然数)。

select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
ROWNUM ID NAME
1 200001 张一
select rownum,id,name from student where rownum =2;
ROWNUM ID NAME
无数据

2. rownum对于大于某值的查询:

如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列。
Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

select rownum,id,name from student where rownum >2;
ROWNUM ID NAME
无数据

可以通过子查询来获取第2条以后的记录,但子查询中的rownum必须要有别名,因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

select * from(select rownum no ,id,name from student) where no>2;
NO ID NAME
3 200003 李三
4 200004 赵四
select * from (select rownum,id,name from student) where rownum>2;
ROWNUM ID NAME
无数据

3. rownum对于小于某值的查询:

查询第三条以前的记录,当使用rownum<3是能得到两条记录的。rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。

select rownum,id,name from student where rownum <3;
ROWNUM ID NAME
1 200001 张一
2 200002 王二

4. rownum某个范围数据的查询:

rownum对小于某值的查询条件是true的,rownum对于大于某值的查询条件是false的,但是可以间接的让它转为是true的。那就要使用子查询。

例如要查询rownum在第2行到第3行之间的数据(包含),那么我们先让它返回小于等于3的记录,然后在主查询中判断新的rownum的别名列>=2的记录行。
但是这样的操作会在大数据集中影响速度。

select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;
NO ID NAME
2 200002 王二
3 200003 李三

5. rownum的排序:

Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

select rownum ,id,name from student order by name;
ROWNUM ID NAME
3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四

可以看出,rownum并不是按照name列来生成的序号。系统在首次查询结果后就给分配了序号,rowid也是顺序分配的。

为了解决这个问题,应该使用子查询:

select rownum ,id,name from (select * from student order by name);
ROWNUM ID NAME
1 200003 李三
2 200002 王二
3 200001 张一
4 200004 赵四
这样就成了按name排序,并且用rownum标出正确序号(有小到大)

个人总结:

1.对于=1或<的可以直接用rownum。

2.对于>或某范围内的查询:先给rownum取别名后,用子查询处理变成正常的查询结果,再进行进一步的处理。

实例演示:

SELECT z.*, ROWNUM row_num
FROM (SELECT a.bookid, a.vote_month
FROM tbbookclick a
WHERE vote_month > 0
ORDER BY a.vote_month DESC) z
WHERE ROWNUM <= inintpagesize * inintpageindex
 OPEN outcurlist FOR
SELECT
t.bookid, t.bookname, t.authorid, t.authorname,
t.channelid, t.channelname, t.categoryid,
t.categoryname, t.subcategoryid, t.subcategoryname,
t.actionstatus, t.newchapterid, t.newchaptername,
t.newchaptertime, t.newvipchapterid,
t.newvipchaptername, t.newvipchaptertime, t.vipstatus,
m.clickrate_month
FROM tbbook t,
(SELECT bookid, clickrate_month
FROM (SELECT z.*, ROWNUM row_num
FROM (SELECT a.bookid, a.clickrate_month
FROM tbbookclick a
WHERE clickrate_month > 0
ORDER BY a.clickrate_month DESC) z
WHERE ROWNUM <= inintpagesize * inintpageindex)
WHERE row_num BETWEEN inintpagesize
* (inintpageindex - 1) + 1
AND inintpagesize * inintpageindex) m
WHERE t.bookid = m.bookid
ORDER BY clickrate_month DESC;

站外扩展阅读:

解析oracle的rownum

Oracle中rownum的用法的更多相关文章

  1. Oracle中rownum的用法总结

      日期:2019/5/22 内容:oracle:数据库:rownum   数据库查询中,常用到"选取前X个"这样的问题,Oracle没有TOP关键字,这类问题都是通过rownum ...

  2. ORACLE 中ROWNUM用法总结(转)

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  3. ORACLE 中ROWNUM用法总结!

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

  4. Oracle中rownum的基本用法

    Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...

  5. 转:ORACLE 中ROWNUM用法总结!

    oracle 分页查询语句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) ...

  6. Oracle中rownum用法警示

    今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...

  7. oracle 中 rownum 和 row_number()

    简单的介绍下oracle 中rownum 和 row_number() 使用,实例演示. 参照:http://www.cnblogs.com/zjrstar/archive/2006/08/31/49 ...

  8. oracle中to_date详细用法示例(oracle日期格式转换)

    这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星期几.两个日期间的天数.月份差等用法 TO_DATE格式(以时间:2007-11-02 ...

  9. ORACLE 中ROWNUM

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...

随机推荐

  1. rails4.2.6配置发送邮件

    调试了很久,最后终于可以发送了 1 在config/environments/development.rb文件里配置邮件信息 config.action_mailer.raise_delivery_e ...

  2. 97、进入ScrollView根布局页面,直接跳到页面底部,不能显示顶部内容

    API使用:http://www.cnblogs.com/over140/archive/2011/01/27/1945964.html 以ScrollView为根的部局,不能从顶部显示其包含的页面内 ...

  3. Centos下搭建ftp服务器

    完全不用那么麻烦,直接可以用xshell中自带的传输文件功能,下载客户端xftp安装就行,不用配置,可以在windows系统向Linux系统的任何文件地方上传下载文件,简单方便,大大节约时间, vsf ...

  4. [Java] 日期的简单处理

    package test.date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.u ...

  5. [ActionScript 3.0] AS 实现JSON转换为XML

    package com.fylibs.utils { /** * @author:Frost.Yen * @E-mail:871979853@qq.com * @create:2015-12-25 下 ...

  6. crm plugin 未能加载文件或程序集“xxxx,”或它的某一个依赖项。系统找不到指定的文件。

    plugin运行出错. 1  plugin文件如果是 注册到disk,应该是注册到 C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembl ...

  7. easyUi中的一段漂亮代码之将list转换成tree.

    function convert(rows){ function exists(rows, parentId){ for(var i=0; i<rows.length; i++){ if (ro ...

  8. JMeter的定时器

    JMeter的十种定时器 先明确一些概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后,不管这个定时器的位置放在sampler之后,还是之前.2)定时器是有作用域的:当执行一个sa ...

  9. 如何为 Drupal 7 网站添加悬浮的反馈按钮?

    最近有客户咨询我们要怎么为 Drupal 网站添加悬浮按钮,方便访客能够链接到反馈表单页面.很幸运,使用 Feedback Simple 模块可以很容易实现. 在这篇短教程中,我将和大家分享如何添加链 ...

  10. socket学习笔记——实现收发文件(Windows)

    记录下来,供自己学习! server.c #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <stdlib.h ...