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,只能用以上符号(<.<=.!=) ...
随机推荐
- 跨域请求 & jsonp
0 什么是跨域请求 在一个域名下请求另外一个域名下的资源,就是跨域请求.example 1:比如:我当前的域名是http://che.pingan.com.我现在要去请求http://www.cnbl ...
- ruby 使用Struct场景
替代类使用,节省代码,清晰简洁 使用Struct SelectOption = Struct.new(:display, :value) do def to_ary [display, value] ...
- java小程序 质数
package com.test; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; im ...
- 【cl】sikuli启动不了
公司电脑:win7+64位 问题:点击sikuli_ide没有反应 卸载了,启动电脑,重新安装.
- using inno setup uninstall default icon
If you set SetupIconFile then the Uninstall Exe File (e.g. unins000.exe) will have exactly same icon ...
- 在开发板Linux上挂载"驱动"挂载不成功,出现提示server 172.27.52.100 not responding, still trying
1.在开发板具体操作步骤如下: 1.1 :设置IP ifconfig eth0 172.27.52.200 1.2 :ping通 虚拟机Linux 主机Linux ping XXX.XXX.X ...
- python字典copy()方法
python 字典的copy()方法表面看就是深copy啊,明显独立 d = {'a':1, 'b':2} c = d.copy() print('d=%s c=%s' % (d, c)) Code1 ...
- 【转】iOS高级向的十道面试问题
原文:http://onevcat.com/2013/04/ios-interview/ 不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘者技 ...
- jmeter测试手机app
具体步骤:1.电脑启动jmeter2.jmeter在测试计划新建线程组,在工作台新建http代理服务器3.设置IE代理到本地4.手机wifi设置代理连接到PC5.[启动]jmeter代理服务器6.现在 ...
- 【LeetCode】7. Reverse Integer 整型数反转
题目: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 思路:不 ...