Oracle在rownum使用结果集排序

   对于 Oracle 的 rownum 问题,非常多资料都说不支持>,>=,=,between...and,仅仅能用以上符号(<、<=、!=),并不是说用>,>=,=,between..and 时会提示SQL语法错误。而是常常是查不出一条记录来,还会出现似乎是莫名其妙的结果来。事实上您仅仅要理解好了这个 rownum 伪列的意义就不应该感到惊奇,相同是伪列,rownum 与 rowid 可有些不一样,以下以样例说明



   有一张表: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使用结果集排序的更多相关文章

  1. ORACLE中用rownum分页并排序的SQL语句

    ORACLE中用rownum分页并排序的SQL语句 以前分页习惯用这样的SQL语句: select * from (selectt.*,rownum row_num frommytable t ord ...

  2. ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)

    这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下.   row_number()over(partition by ...

  3. oracle之rownum(伪列)

    整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...

  4. oracle 分页(rownum的理解) 以及 树节点的查询

    1:什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条rownum=1, 第二条=2. 对于 O ...

  5. Oracle的rownum原理和使用

    整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...

  6. Oracle的rownum原理和使用(整理几个达人的帖子)

    整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...

  7. Oracle中rownum的基本用法

    Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...

  8. oracle中rownum和row_number()

    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内 ...

  9. Oracle中rownum用法警示

    今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...

随机推荐

  1. linux下磁盘进行分区、文件系统创建、挂载和卸载(转)

    任务的原因:由于,刚购买来的服务器需要将磁盘挂载到操作系统上,为了挂载磁盘首先要对磁盘进行分区,然后进行文件系统的创建,最后将磁盘挂载到操作系统上的某个目录. MBR(Master Boot Reco ...

  2. web前端利用HSTS(新的Web安全协议HTTP Strict Transport Security)漏洞的超级Cookie(HSTS Super Cookie)

    web前端如果想实现cookie跨站点,跨浏览器,清除浏览器cookie该cookie也不会被删除这似乎有点难,下面的教程让你完全摆脱document.cookie 1.服务器端设置HSTS 如PHP ...

  3. AndroidUI的组成部分RoomButton

    <!-- 知识点汇总: 1.Button与ImageButton的差别在于,Button生成的button上显示文字 而ImageButton上则显示图片.须要指出的是:为ImageButton ...

  4. Hsql中In没有1000的限制

    SELECT * FROM user , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ...

  5. 三种字符编码:ASCII、Unicode和UTF-8

    原文:三种字符编码:ASCII.Unicode和UTF-8 什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字 ...

  6. MySQL之终端(Terminal)管理MySQL

    原文:MySQL之终端(Terminal)管理MySQL 前言:MySQL有很多的可视化管理工具,比如“mysql-workbench”和“sequel-pro-”. 现在我写MySQL的终端命令操作 ...

  7. hdu4758 Walk Through Squares (AC自己主动机+DP)

    Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...

  8. mysql函数二

    四.条件推断函数 1.if(expr,v1,v2)函数:成立返回结果v1,否则结果v2 例:select id,if(grade>=60,'pass','fail') from t; 2.IFN ...

  9. poj 1004 Dividing

    大意是,从输入六个数 .第i个数代表价值为i的有几个,平均分给两个人 ,明摆着的背包问题,本来以为把他转化为01背包.可是TLe,后来发现是12万的平方还多,所以妥妥的TLE,后来发现这是一个全然背包 ...

  10. 表与表的关系把RD搞乱了,记一个Procedure中的bug

    就是6张表的关联查询,写了一个存储过程,使用4层for来处理 bug:最后一个for中,两张表的关联条件少了一个,结果数据多查了. 排查办法:使用dbms_output.printline('');每 ...