`

oracle rownum 学习

阅读更多
----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"

参考网址:http://www.examda.com/oracle/zhonghe/20091209/100421867.html

分享到:
评论
1 楼 zhangyou1010 2010-10-12  
    
帮我扫盲了,谢谢。

相关推荐

    Oracle学习笔记(rownum和rowid)

    Oracle学习笔记(rownum和rowid),有具体的代码案例讲解rownum和rowid

    mysql类似oracle rownum写法实例详解

    在本篇文章里小编给大家分享的是关于mysql类似oracle rownum写法以及相关实例内容,需要的朋友们可以学习下。

    ORACLE数据库中ROWNUM用法详解

    主要介绍了ORACLE数据库中ROWNUM用法详解,对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,且rownum不能以任何表的名称作为前缀,需要的朋友们下面随着小编来一起学习学习吧

    Oracle数据库学习指南

    40. 如何正确利用Rownum来限制查询所返回的行数 41. 什么是ROWID,为什么需要它 42. 手工安装数据库时需要安装那些系统包 43. 手工创建数据库的全部脚本及说明 44. 提高Oracle数据库应用系统安全的举例与分析 ...

    通过ROWNUM取得第二条数据

    目前,很多人想通过ROWNUM取得第N条数据,可以没有办法实现。现在本人有这么一条语句,供大家学习学习。通过ROWNUM取得第二条数据

    oracle学习及练习语句

    1.Oracle中的一些练习_ddl语句 2.最常用的联系表,企业员工表。以后Oracle联系表就使用这个表啦... 3.查询及删除重复记录的方法大全 4.ORACLE 中ROWNUM用法总结!

    Oracle高级sql学习与练习

    8、ROWNUM-TOP-N分析 9、相关子查询和非相关子查询 10、增强GROUP BY 11、分析函数(ANALYTICAL FUNCTIONS) 12、ROWID的使用 13、ORACLE 10G正则表达式 14、使用HINT 15、PARITION分区 16、并行操作 17、扩展DDL和...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    oracle学习笔记(知识点补充).zip

    这是我自己学习oracle的时候,写的代码案例和笔记(rownum和rowid、嵌套表、可变数组、闪回、事务、索引、备份和恢复、用户创建和权限授予、序列和同义词、设计范式等等知识点),大家可以作为参考!

    oracle学习笔记(二)

    一、多行函数又称组合函数(Group ...但可以使用having avg(列1)&gt;1000 having所起的作用和where一样 二、子查询Subqueries 查询前10行数据 oracle: select * from 表名 where rownum&lt;=10; sql: select top 10

    2009达内SQL学习笔记

    export ORACLE_HOME=/oracledata/.../bin: 一、注意事项: 大小写不敏感,即不区分大小写。提倡关键字大写,便于阅读和调式。 “!”在SQL环境下执行Unix命令。 SQL语句是由简单的英语单词构成;这些英语单词...

    Java学习笔记-个人整理的

    {12.13.3}rownum}{175}{subsection.12.13.3} {12.13.4}update}{176}{subsection.12.13.4} {12.13.5}delete}{177}{subsection.12.13.5} {12.13.6}drop}{177}{subsection.12.13.6} {12.13.7}rename}{177}{...

    访问数据库的几种方法

    这部分很基础,但是如果搞不清楚,对以后的学习会有影响。  SQL&gt; select * from v$version where rownum=1;  BANNER  ——————————————————————————–  Oracle Database 11g ...

    收获不止SQL优化

    12.1.2 Rownum分页改写 337 12.1.3 Hint直接路径改造 338 12.1.4 只取你所需的列 339 12.1.5 避免或者减少递归调用 341 12.1.6 ROWID优化应用 347 12.2 设法避免外因影响 350 12.2.1 Hint改写确保执行计划...

Global site tag (gtag.js) - Google Analytics