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. HTML5 3D翻书效果(双面效应)

    最后使用HTML5翻书效果达到测试,比较简单,它的升级版是 最后一个问题: 1)后,原来的页面连环画将成为一面镜子 2)无法实现双面翻书. 3)明显感觉页面似有近遮挡标志. 这次的升级版本号实现过程比 ...

  2. 关于sql中去换行符的问题

    今天要用bootstrap开发一个网页,要使用到JSON,但是JSON的格式不正确,然后在http://www.bejson.com/[Be JSON]中测试了一下JSON. 发现JSON中多了一个换 ...

  3. 《Swift程序设计语言》中国翻译和学习笔记page23

    ·<The Swift Programming Language>中文翻译及读书笔记,附件中为英文原版教程 因21页之前内容和技术关系不大,不做翻译整理,从第21页開始 · 页 1 本页主 ...

  4. nginx: [emerg] the size 10485760 of shared memory zone "cache_one" conflicts with already declared size 0

    注意配置段中的区域包含关系. proxy_cache_patch 要在proxy_cache前已经定义. what seems to be the problem? [emerg]: the size ...

  5. RH253读书笔记(8)-Lab 8 Securing Data

    Lab 8 Securing Data Goal: Gain familiarity with encryption utilities Sequence 1: Using SSH keys with ...

  6. 09应用输入经理旋转场景--《猿学校课程Unity3d》

    为什么极品飞车游戏等.,我们可以通过系统设置非常的方面根据自己喜欢的操作模式设置,有些人喜欢用箭头来控制不喜欢与使用"W,S,A,D"控制,这就解释程序猿不会死在程序写入内部控制, ...

  7. Git现实(一个)版本控制概述

    从今天开始.我们了解的分布式版本控制系统Git相关内容.了解Git之前,我们的第一个版本控制系统,使宏观的描述. 什么是版本号控制 版本号控制是指通过对文件内容的变化进行记录,并为每次的变化进行编号, ...

  8. php小写金额转大写

    public static function amountInWords($num) {         if (!is_numeric($num) || empty($num))           ...

  9. Mencached使用

    Mencached使用小记 该文章简单记录一下在Windows平台下安装与配置Memcached的方法,Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. ...

  10. .NET中Redis安装部署及使用方法简介

    一Redis服务端以服务方式运行 修改端口压缩文件中配置的是6488 修改密码 修改库的数量 工具配置安装后如下图 二Redis服务端以控制台方式运行 第一步配置本地服务 第二部安装和配置客户端 三C ...