oracle rownum 学习

原创 2013年12月04日 09:59:51

文章转自http://qingfeng825.iteye.com/blog/779462

 

----oracle排序写法
SELECT * FROM ( 
SELECT list.*, rownum as RNUM FROM ( 
SELECT *   FROM CIP_Test_User                                                   
ORDER BY ID desc ) 
list WHERE ROWNUM <   11 ) WHERE RNUM >=1 
 

 

 

1、为什么不直接用  SELECT a.*,rownum  FROM CIP_Test_User a   ORDER BY ID desc进行排序?
   因为rownum计算比ORDER BY ID desc 更有优先级,rownum的值不会按照排序后的记录顺序重新计算,所

以如果这样做要取排序后的记录肯定是有错误的。


2、为什么要先取 ROWNUM <  5,再循环一次取ROWNUM >1?用下面的语句行不行?
 SELECT list.*, rownum as RNUM FROM (
  SELECT a.*,rownum  FROM CIP_Test_User a   ORDER BY ID desc)
  list WHERE ROWNUM <  5 and ROWNUM >1

验证结果:取出的记录为0行。
因为1:当用rownum做为条件时,只能用小于、小于等于、等于(只能等于1),而用大于、大于等于是没有结果的。
       因为oracle计算时,当出现一个 rownum 不满足条件的时候则 查询结束   this is stop key!

 

 

 

rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,

这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。

(1) rownum 对于等于某值的查询条件

  如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学

生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判

断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

(2)rownum对于大于某值的查询条件

  如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是

从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录
    SQL> select rownum,id,name from student where rownum >2;

  ROWNUM ID     NAME

  ---------- ------ ---------------------------------------------------
    那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须

要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道

rownum是子查询的列还是主查询的列
    SQL>select * from(select rownum no ,id,name from student) where no>2;

  NO ID     NAME

  ---------- ------ ---------------------------------------------------

  3 200003 李三

  4 200004 赵四

  SQL> select * from(select rownum,id,name from student)where rownum>2;

  ROWNUM ID     NAME

  ---------- ------ ---------------------------------------------------
    (3)rownum对于小于某值的查询条件

  如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。显然rownum对于rownum<n

((n>1的自然数)的条件认为是成立的,所以可以找到记录。

  SQL> select rownum,id,name from student where rownum <3;

  ROWNUM ID     NAME

  ---------- ------ ---------------------------------------------------

  1 200001 张一

  2 200002 王二
    综上几种情况,可能有时候需要查询rownum在某区间的数据,那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true 的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum 在第二行到第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。

  SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;

  NO ID     NAME

  ---------- ------ ---------------------------------------------------

  2 200002 王二

  3 200003 李三
   (4)rownum和排序
“select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便取20条记录,然后再 order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询 来实现先排序,后rownum,方法如下:

  "select * from (select * from tabname order by name) where rownum<20",但这样一来,效率会较低很多。

  但是,在order by 的字段上加主键或索引即可让oracle先按 该字段排序,然后再rownum;方法不变:

  “select * from tabname where rownum<20 order by name"

 

ORACLE中的rownum排序及row_number()排序的区别

ORACLE中常用的是通过rownum来分页,下面来讨论下rownum分页的原理,rownum分页排序和row_number()函数分页排序的区别。       菜鸟第一次用rownum容易犯的错:...
  • wangxinde317
  • wangxinde317
  • 2013年03月08日 11:30
  • 1301

Oracle中rownum的用法解析

对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。...
  • xueshuangshuang123
  • xueshuangshuang123
  • 2013年04月10日 10:27
  • 5225

ORACLE的rownum用法讲解

如果选择踏足,终有一天你会爱上这条路。   今天讲讲ORACLE中关于ROWNUM的用法:   一、简单介绍一下ROWNUM是什么,可以用来干什么。 答:ROWNUM是一个序列,会根据sql...
  • happyqiuqiang
  • happyqiuqiang
  • 2016年08月17日 13:12
  • 12279

Oracle数据库之rownum

Oracle数据库之rownum1. 介绍当我们在做查询时,经常会遇到如查询限定行数或分页查询的需求,MySQL中可以使用LIMIT子句完成,在MSSQL中可以使用TOP子句完成,那么在Oracle中...
  • zhliro
  • zhliro
  • 2015年06月22日 22:12
  • 1328

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

对于Oracle的rownum问题,很多资料都说不支持>,>=,=,between……and,只能用以上符号(,>=,=,between……and 时会提示SQL语法错误,而是经常是查不出一条记录来,...
  • hr541659660
  • hr541659660
  • 2016年09月13日 09:49
  • 620

Oracle中rownum和 order by联合使用导致排序错乱

在使用Oracle进行分页查询的时候,一般情况下我们都会携带很多参数。但是今天发现一个很奇怪的东西,当排序字段不是主键,且多条数据中该排序字段的值均相同的情况下,会出现分页查询的排序顺序和不分页查询的...
  • zhaoguoshuai91
  • zhaoguoshuai91
  • 2015年08月21日 13:59
  • 4110

ORACLE——ROWNUM解析(使用ROWNUM大于条件,无法得到任何查询结果)

标题:Oracle中的rownum不能使用大于>的问题 转自网络,稍做修改: 一、对rownum的说明    关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中...
  • jQuerys
  • jQuerys
  • 2016年09月04日 15:41
  • 2441

oracle 中使用 rownum 的一个误区

子查询用了 order by,外层查询用了 rownum,得到的结果可能不是你想的那样
  • zhiren201207
  • zhiren201207
  • 2017年03月15日 21:40
  • 108

oracle笔记整理5——delete与truncate,rowid与rownum,删除重复记录

1) delete与truncate a) delete一行一行删除,并且记录日志,truncate释放用于存储表数据的数据页(extent)来删除数据,在日志中只记录页的释放,故无法rollbac...
  • thinkpadshi
  • thinkpadshi
  • 2016年01月02日 14:45
  • 888

Oracle数据库中的ROWNUM和ORDER BY执行顺序

使用SQL查询Oracle表数据的时候,可能会有如下两种结果需求。 对查询结果集排序,并获得其排序前的行号 对结果集排序后,为每一行加入行号 对于上述两种结果需求,编写SQL语句的时候,需要注意...
  • haiross
  • haiross
  • 2015年01月26日 14:42
  • 2215
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle rownum 学习
举报原因:
原因补充:

(最多只允许输入30个字)