Oracle中rownum在结果集中排序的使用

   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, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。

  先好好理解 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后,排序操作在内存中可以轻松完成。

时间: 2024-11-03 04:35:53

Oracle中rownum在结果集中排序的使用的相关文章

oracle中rownum和row_number()_oracle

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). 与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后是先排序再计算行号码. 一.oracle中rownum 用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字

ORACLE 中ROWNUM用法总结!

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

Oracle数据库rownum和row_number的不同点_oracle

明确对于rownum 来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是二,以此类推,这个为字段可以用于限制查询的返回的总行数,因为rownum总是从1开始,但是1以上的自然数在rownum 做等于判断时都认为是false 条件,所以无法查到 rownum=n (n>1的自然数),所以查找第二行以后的记录可以用子查询方法来解决,给子查询中的rownum取别名;对于小于某个值的情况两种方法都差不多,但是对于某个不等于一的值或者求某个值到某个值之间的情况,用ro

Oracle数据库中对null值的排序及mull与空字符串的区别_oracle

order by排序之null值处理方法在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题.在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则排在最前.所以,为何分析数据的直观性方便性,我们需要对null的记录值进行相应处理. 这是四种oracle排序中NULL值处理的方法:1.使用nvl函数语法:Nvl(expr1, expr2)     若EXPR1是NULL,則返回

Oracle查询语句中rownum与rowid的不同之处分析_oracle

本文主要是以实例形式介绍了Oracle查询中rownum与rowid的不同之处,以及以假设的方式为例,查询条件为rownum = 2,在查询出第一条记录时的具体内容的介绍. 在查询中,我们可以注意到,类似于 select xx from table where rownum < n (n>1) 这样的查询是有正确含义的,而 select xx from table where rownum = n 这样的查询只在n=1的时候成立, select xx from table where rown

Oracle中的rownum与DB2中的row_number()over()

问题描述 Oracle中的rownum与DB2中的row_number()over() select rownum , m.* from (select '汇总' as MENUNAMES,count(*) as NUMCOUNT from PEVENTRECORD where (EVENT='CLICK' OR EVENT = 'VIEW') AND TO_CHAR(TRANSTIME,'yyyy-MM-dd') >= '2015-02-02' AND TO_CHAR(TRANSTIME,'y

oracle中sql 截取字段中的数字按条件排序

问题描述 oracle中sql 截取字段中的数字按条件排序 请教各位,这个sql怎么拼,我的字段(code)规则是:备案事项[2014]1,前面中文是固定的,然后是括起来的年份(可能是2013,2014,2015等等),后面是流水号(从1,2,3,...,10,..递增的),我想查出所有2013年的数据,要求按后面的流程号数字倒叙排列.恳求大神帮忙,谢谢! 解决方案 假设字段名是code SELECT code, substr(code,INSTR(code,'[', 0, 1)+1,INSTR

oracle中的rownum问题

问题描述 oracle中的rownum问题 为什么这样 SELECT * FROM TESTROWNUM T WHERE ROWNUM in (1,2,3,4,5,6,7,8,9) 有结果 这样就没有结果 SELECT * FROM TESTROWNUM T WHERE ROWNUM in (SELECT ROWNUM rn FROM (SELECT ID FROM TESTROWNUM T1 ORDER BY T1.ID ASC) where ROWNUM < 10) 解决方案 SELECT

ORACLE中查询第n条到第m条的数据记录的方法

一.经过测试,下面的方法通过:   SELECT * FROM             (                  SELECT 表名.*, ROWNUM AS CON FROM 表名 WHERE ROWNUM <= M AND 其它查询条件 ORDER BY 排序条件              )WHERE CON >=N;   二.参考其它网上的方法   SQL/Oracle取出第 m 条到第 n 条记录的方法   用一句SQL取出第 m 条到第 n 条记录的方法 用一句SQL取