Oracle中rownum的用法
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的用法总结
日期:2019/5/22 内容:oracle:数据库:rownum 数据库查询中,常用到"选取前X个"这样的问题,Oracle没有TOP关键字,这类问题都是通过rownum ...
- ORACLE 中ROWNUM用法总结(转)
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- ORACLE 中ROWNUM用法总结!
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- Oracle中rownum的基本用法
Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...
- 转:ORACLE 中ROWNUM用法总结!
oracle 分页查询语句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) ...
- Oracle中rownum用法警示
今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...
- oracle 中 rownum 和 row_number()
简单的介绍下oracle 中rownum 和 row_number() 使用,实例演示. 参照:http://www.cnblogs.com/zjrstar/archive/2006/08/31/49 ...
- oracle中to_date详细用法示例(oracle日期格式转换)
这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星期几.两个日期间的天数.月份差等用法 TO_DATE格式(以时间:2007-11-02 ...
- ORACLE 中ROWNUM
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
随机推荐
- 设置oracle_home
set ORACLE_HOME=F:\app\rh\product\11.2.0\dbhome_1
- 服务器压力测试 ab
1.ab命令原理 Apache自带的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力(测试其它服务器时需单独下载ab压力测试工具 ...
- shell export
export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝.这个过程称之为变量输出. 在脚本中export,跟在终端export原理一样. 他们都是一个子shell. http://b ...
- 为什么老师不喜欢RelativeLayout
这个要看个人喜好.RelativeLayout对于一些简单布局来说反而复杂了.要计算相对距离这些.用线性布局只要利用好weight可以很直观的实现效果.所以这个因个人喜好而定 对于讲一些简单的功能来说 ...
- crm 4 注释与上传附件权限
文档注释权限及上传附件是与实体的”追加到”权限有关. 文档注释权限及上传附件是与核心记录中”注释”的”追加”权限有关. 追加及追加到的权限,我的理解是与本实体有关联的实体的权限,比如你引用了其它表的字 ...
- 解决Web部署 svg/woff/woff2字体 404错误(转)
http://blog.sina.com.cn/s/blog_4997f1b90102vkjn.html 最近项目中用到了fontawesome-webfont.svg等字体.部署项目后,发现没有&l ...
- 转载cocos2dx的各种动作用法
以下内容来源于:http://www.cnblogs.com/linux-ios/archive/2013/04/06/3001946.html 转载时请保留以上链接. bool HelloWorld ...
- 再战map
以前自己整理过map容器,但是好像没有这篇这么系统... Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处 ...
- 一个关于发邮件的类,可以模拟发送对smtp服务器或者是本地文件夹
namespace SportsStore.Domain.Concrete { public class EmailSettings { public string MailToAddress = & ...
- IEnumerable和List有什么区别?
如下.IList接口可以使用更多的方法.比如你看一个集合是否包含相应实体, IEnumerable不行,而 IList里有Contains,相应的实现了IList的可以添加,删除相应实体.而IEnum ...