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 ...
随机推荐
- bitnami redmine 安装插件
https://wiki.bitnami.com/Applications/BitNami_Redmine_Stack#How_to_install_a_plugin_on_Redmine.3f 版权 ...
- 复制(5)——事务复制中的发布者(Publisher)
发布者是所有被复制(replicated)的数据的集合.每个发布者可以有多个发布(publication),每个发布项包含多个项目(articles),但是这些发布必须处于一个单一的数据库中,而每个项 ...
- OAuth打造webapi认证服务
使用OAuth打造webapi认证服务供自己的客户端使用 一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorizati ...
- COCOFrame
COCOFrame它是一个轻量级的开发框架,综合Android APP开发过程中经常使用的工具,方法,特效.当中F类採用的AndroidQuery实现,做了进一步的封装及部分优化. 1. Jar包大小 ...
- SQL入门学习0-数据库与SQL
1.1 DBMS DatabaseManagermentSystem 数据库管理系统 DBMS种类 层次型数据库(HDB) 最古老的数据库之一,把数据通过层次结构的方式表现. 关系型数据库(RDB) ...
- 【MongoDB】在windows平台mongodb切片集群(三)
在过去的两年我们博客详细阐述了零碎工作集群和打造过程.在这篇博客中,我们主要分析测试结果一起支离破碎集群. 首先来看看碎片集群的每个状态.你可以看出来复制集A和B都是正常的: 一.开启分片集合 开启一 ...
- Angular规范
只记录一些自己未曾用过,但觉得对以后的项目有帮助的规范 一 Javascript闭包 把Angular组件包装到一个立即调用函数表达式中(IIFE). 为什么?:把变量从全局作用域中删除了,这有助于 ...
- 由于抽签HT For Web ComboBox下拉框组件
传统HTML5的下拉框select仅仅能实现简单的文字下拉列表,而HT for Web通用组件中ComboBox不仅可以实现传统HTML5下拉框效果,并且可以在文本框和下拉列表中加入自己定义的小图标, ...
- SVN常见错误两项纪录
1.svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted 也许前clean ...
- oracle----sqlldr用法(转)
SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中.SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PAR ...