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,只能用以上符号(<.<=.!=) ...
随机推荐
- Nginx 配置指令location 匹配符优先级和安全问题【转】
Nginx配置指令location匹配符优先级和安全问题 使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";&q ...
- linux 去掉 ^M
要去除他,最简单用下面的命令: dos2unix filename 亲测可用 以下方式不可以: set ff=unix %s/^M//g 可能是^M输入方式有问题 ^M 输入方法: ctrl+V ...
- 彻底删除mysql服务
http://wenku.baidu.com/link?url=XEOFkNXElJV6FoBDOs7m7BlDUv9-ZuLbRbeVwbMa7AXa8ukZ6oIpiYYy3gNnITmP911M ...
- Flex使用宋体渲染越南语显示错误
本来应该显示Lưu nhóm,偏偏编译后显示Lưu nhòm.二声变成了四声,并且某些情况下,刚打开的窗口时二声的,然后变成了四声.初始以为是Flex的问题,分别使用S和mx包下的Label做实验,后 ...
- SQL(Oracle)
http://blog.csdn.net/winter13292/article/details/7011377 SQL 对大小写不敏感! 在 SQL 中增加 HAVING 子句原因是,WHERE ...
- 蓝桥杯---剪格子(DFS&BFS)(小总结)
问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...
- css first-letter实现首字(字母)下沉效果
css 首字下沉效果原理 首字下沉主要使用到css的first-letter伪元素,然后配合使用font-size和float来设置文字的样式即可实现. first-letter选择器选取指定元素文本 ...
- php mysql_affected_rows获取sql执行影响的行数
php mysql_affected_rows函数用于获取执行某一SQL语句(如INSERT,UPDATE 或 DELETE )所影响的行数,本文章向大家介绍php mysql_affected_ro ...
- jmeter随笔(5)--断言中正则表达式的特殊字符问题和中文乱码显示问号的问题
最近在工作中,对jmeter实践的点滴的记录,这里分享交流,不一定正确,仅供参考和讨论,有想法的欢迎留言.谈论,手机上图片如果不清晰,请点击[阅读原文]查看. 问题:今天QQ群一朋友遇到jmeter的 ...
- docker-tomcat-nginx 反向代理和负载均衡
1.部署tomcat镜像 下载官方的tomcat镜像. -jre7 启动docker容器,2个实例,分别映射不同的端口号, ~/work/sample-webapps/[v1.0|v2.0]/下面存放 ...