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,只能用以上符号(<.<=.!=) ...
随机推荐
- Web性能压力测试工具之Apache AB 详解
下载安装地址: http://httpd.apache.org/download.cgi yum install httpd-tools http://www.apachelounge.com/dow ...
- 20145305《Java程序设计》实验三
(一)敏捷开发与XP 1.了解什么是敏捷开发 敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法."敏捷流程"是一系列价值观和方法论的集合. ...
- C++学习6
类是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型.类这种数据类型是一个包含成员变量和成员函数的一个集合. 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存空间.但 ...
- [ActionScript 3.0] AS3.0 马赛克效果
var bmpd:BitmapData; var matrix:Matrix; var bmp:Bitmap; var size:Number = 5; /** * @author:Frost.Yen ...
- [ActionScript 3.0] AS3 访问舞台上元件的方法
文档类: package { import flash.display.MovieClip; public class Main extends MovieClip { public function ...
- JDK环境变量中dt.jar、tools.jar等变量值的作用
变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; tools.jar: 工具类 库,它跟我们程序中用到的 基础 ...
- [kuangbin带你飞]专题十五 数位DP
ID Origin Title 62 / 175 Problem A CodeForces 55D Beautiful numbers 30 / 84 Problem B HD ...
- 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server
点击打开链接 2226: Contest Print Server Time Limit: 1 Sec Memory Limit: 128 MB Submit: 53 Solved: 18 [Su ...
- 50. Pow(x, n) (编程技巧)
Implement pow(x, n). double sum = 1; if (n > 0) { while ((n--) > 0) sum *= x; return sum; } el ...
- Wireshark "The NPF driver isn’t running…"
(1)如果你使用的是Linux.Ubuntu系统,请用 >$ su Administrator命令切换到拥有最高权限的帐号,然后再输入命令:“net start npf”(如果不行自己查找类似命 ...