关闭

oracle rownum 学习

241人阅读 评论(0) 收藏 举报

文章转自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"

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:329363次
    • 积分:8939
    • 等级:
    • 排名:第2254名
    • 原创:1096篇
    • 转载:14篇
    • 译文:0篇
    • 评论:5条
    最新评论