Oracle在rownum使用结果集排序
有一张表:tbrole
若是运行语句select r.*,rownum from tbrole r where rownum > 10;----结果经常查不出不论什么结果。可是查看数据库的时候我们却是能够看到数据库中有记录的。
假设用 select rownum,c1 from t1 where rownum < 10, 仅仅要是用小于号,查出来的结果非常easy地与一般理解在概念上能达成一致,应该不会有不论什么疑问的。
先好好理解 rownum 的意义吧。由于ROWNUM是对结果集加的一个伪列。即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1開始排起的。
所以你选出的结果不可能没有1。而有其它大于1的值。所以您没办法期望得到以下的结果集:
11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................
rownum >10 没有记录,由于第一条不满足去掉的话。第二条的ROWNUM又成了1。所以永远没有满足条件的记录。
但假设就是想要用 rownum > 10 这样的条件的话话就要用嵌套语句,把 rownum 先生成。然后对他进行查询。
select *
from (selet rownum as rn,r.* from tbrole r where ...)
where rn >10
一般代码中对结果集进行分页就是这么干的。
oracle的rownum是在提取记录就已经生成,它先于排序操作。所以必须使用子查询先排序。
ROWNUM值的分配是在查询的谓词解析之后,不论什么排序和聚合之前进行的。
所以:若是想分页查询出tbrole中的相应记录,则不须要这样来运行SQL语句
select * from
(select r.role_id,r.role_name,r.status,to_char(r.create_time,'YYYY-MM-DD HH24:MI:SS') create_time,
to_char(r.update_time,'YYYY-MM-DD HH24:MI:SS') update_time,r.description,rownum rn from (select * from tbrole
order by create_time asc) r where 1=1
and rownum <= 20 )
where rn >= 1;
而不应该是:
select * from
(select r.role_id,r.role_name,r.status,to_char(r.create_time,'YYYY-MM-DD HH24:MI:SS') create_time,
to_char(r.update_time,'YYYY-MM-DD HH24:MI:SS') update_time,r.description,rownum rn from (select * from tbrole ) r where 1=1
and rownum <= 20 )
where rn >= 1 order by create_time asc;
运行顺序:
FROM/WHERE子句先被运行.
依据FROM/WHERE子句输出的行, ROWNUM被分配给他们并自增长.
SELECT 被应用.
GROUP BY 被应用.
HAVING is 被应用.
ORDER BY 被应用
ROWNUM对性能的影响
ROWNUM能够避免oracle在磁盘上进行排序。
rownum无法避免全表扫描的发生。可是它能够避免对整个表数据的排序操作,在指定了rownum后,排序操作在内存中能够轻松完毕。
博客參考资料:http://blog.csdn.net/c04s31602/article/details/5105161
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Oracle在rownum使用结果集排序的更多相关文章
- ORACLE中用rownum分页并排序的SQL语句
ORACLE中用rownum分页并排序的SQL语句 以前分页习惯用这样的SQL语句: select * from (selectt.*,rownum row_num frommytable t ord ...
- ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)
这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下. row_number()over(partition by ...
- oracle之rownum(伪列)
整理和学习了一下网上高手关于rownum的帖子: 参考资料: http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...
- oracle 分页(rownum的理解) 以及 树节点的查询
1:什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条rownum=1, 第二条=2. 对于 O ...
- Oracle的rownum原理和使用
整理和学习了一下网上高手关于rownum的帖子: 参考资料: http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...
- Oracle的rownum原理和使用(整理几个达人的帖子)
整理和学习了一下网上高手关于rownum的帖子: 参考资料: http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...
- Oracle中rownum的基本用法
Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...
- oracle中rownum和row_number()
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内 ...
- Oracle中rownum用法警示
今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...
随机推荐
- 对SA权限的再突破 (对付xplog70.dll被删)转载
原文:对SA权限的再突破 (对付xplog70.dll被删)转载 对SA权限的再突破 (对付xplog70.dll被删)转载 转载自:http://www.bitscn.com/plus/view.p ...
- Cocos2d-x 单点触摸--让我们用手指动起来的精灵
转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/25656673 效果图: CCTouch类装载了触摸点的信息.包含触摸点的横纵坐标值和触 ...
- C#二进制字节数组操作功能 拦截字节数组SubByte
C#二进制字节数组操作功能 拦截字节数组SubByte /// <summary> /// 截取字节数组 /// </summary> /// <param name=& ...
- iOS当该装置是水平屏,frame和bounds分别
project那里有两个ViewControllers.间ViewController它是root view controller,红色背景,有一个顶button,点击加载后GreenViewCont ...
- MyEclipse调整项目的顺序
MyEclipse该项目是按照字母顺序排列的项目名称,无法调整. 例,我现在做Photo工程项目,向下位置,非常不方便: 可是,它有一个将项目分组的功能"Working Sets" ...
- Visual Studio Team Services使用教程--邀请团队成员
- Arduino 数码管LED驱动器 阵列方法
样品谈到最后一个驱动程序LED数码管,采用了最简单的解决方案之一,对于每一个LED高低电平控制,这样的好处是每个LED控制可检.避免短路造成的错觉,因为,但是对于数字的变化是,它是多余的写,因此,这种 ...
- windows(64位)下用vagrant+virtualbox 管理虚拟机具体解释
windows下安装(64位) vagrant 跟 vituriebox http://blog.smdcn.net/article/1308.html Host: 127.0.0.1 Port: 2 ...
- 探索Scala(1)-- 运算符重载
Scala语言运算符重载全然是语法层面的小把戏,本文记录我对Scala语言运算符重载的一些理解. 方法调用语法糖 调用方法时,Scala同意省略点号和圆括号,如以下代码所看到的: 把运算符映射成单词 ...
- Unity3d 镜面反射 vertex and frag Shader源代码
Unity3d 镜面反射 网上能找到的基本上是固定管道或表面渲染的shader. 特此翻译为顶点.片段渲染的Shader, 本源代码仅仅涉及shader与cs部分. Editor部分使用NGUI绘制的 ...