`
Eric.Yan
  • 浏览: 318962 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle--ROWNUM和row_number

阅读更多

<转>

Rownum对小于某值的查询条件是人为true的,rownum对于大于某值的查询条件直接认为是false的。

(乍看这句话还真是不理解,不过慢慢往下看就好……)


理解rownum的关键是Oracle如何执行查询语句。如果先执行笛卡尔集运算,再执行where条件限制,那么rownum就可以实现rownum> n(n>=1)的功能。但oralce是边执行笛卡尔集运算,边应用选择条件,所以rownum>n(n>1=)永远不成立;
ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说,rownum是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值;
注意:rownum不能以任何基表的名称作为前缀
用ROWNUM = 1可以得到一条记录:
SQL> select seq, fee_cde from tmp_session_01 where rownum = 1;

  SEQ FEE_CDE
----- ----------
    1 B01

Rownum > 1没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录;
SQL> select seq, fee_cde from tmp_session_01 where rownum > 1;

  SEQ FEE_CDE
----- ----------

用ROWNUM >= 1 可以返回所有记录,因为第一条件记录满足rownum = 1的条件;记录集添加下一条记录时,rownum = 2也满足rownum>1的条件;后面的记录也会依次像第二条一样添加进来。
SQL> select seq, fee_cde from tmp_session_01 where rownum >= 1;

  SEQ FEE_CDE
----- ----------
    1 B01
    1 L01
    2 B01
    3 B01

用ROWNUM >= 2 不会返回记录:
SQL> select seq, fee_cde from tmp_session_01 where rownum >= 2;

  SEQ FEE_CDE
----- ----------

用rownum < 2返回第2条之前,即第1条记录:
SQL> select seq, fee_cde from tmp_session_01 where rownum < 2;

  SEQ FEE_CDE
----- ----------
    1 B01

用子查询其他方法就可以返回某个区间的记录:
SQL> select * from (select rownum no, seq, fee_cde from tmp_session_01 where rownum <4) where no > 2;

        NO   SEQ FEE_CDE
---------- ----- ----------
         3     2 B01

 

row_number():
和rownum差不多,功能更强一点,可以在各个分组内从1重新排序;但是必须和开窗函数一起使用,也就是说必须分组。

(详细链接:http://chenxy.blog.51cto.com/blog/729966/728838

SQL> select a.loan_typ, row_number() over(partition by a.loan_typ order by a.loan_no) drk, a.loan_no
  2  from loan_dealer_info a;

LOAN_TYP        DRK LOAN_NO
-------- ---------- --------------------
11101             1 2100000131
11101             2 2100000199
11101             3 2100000206
11101             4 2100000214
11101             5 2100000222
11101             6 2100000230
11101             7 2100000248
11101             8 2100000256
11101             9 210000031301
11101            10 210000032101
11102             1 2100002201
11102             2 2100003001
11102             3 2100006401
11102             4 2100009801
11114             1 2100001901
11116             1 2100011401
11121             1 2100002201
11121             2 2100004801
11121             3 2100005601
11121             4 2100006401

LOAN_TYP        DRK LOAN_NO
-------- ---------- --------------------
11121             5 2100012101
11121             6 2100013901
11121             7 2100016301
11121             8 2100019701
11121             9 2100020401
11121            10 2100021201
11122             1 2100005401
(后面省略)

142 rows selected
(原始表的记录数)

可以自由使用row_number > n的条件进行过滤,因为它是真实产生的一行,不像rownum一样是虚拟的行
SQL> select * from
  2  (
  3  select a.loan_typ, row_number() over(partition by a.loan_typ order by a.loan_no) drk, a.loan_no
  4  from loan_dealer_info a
  5  ) t where drk > 3;

LOAN_TYP        DRK LOAN_NO
-------- ---------- --------------------
11101             4 2100000214
11101             5 2100000222
11101             6 2100000230
11101             7 2100000248
11101             8 2100000256
11101             9 210000031301
11101            10 210000032101
11102             4 2100009801
11121             4 2100006401
11121             5 2100012101
11121             6 2100013901
11121             7 2100016301
11121             8 2100019701
11121             9 2100020401
11121            10 2100021201
11122             4 2100015301
11123             4 2100007801
11123             5 2100008601
11123             6 2100009401
11141             4 2100008801

(后面省略)

64 rows selected

reference link: http://sporting426634.blog.sohu.com/157369217.html

 

 

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

有关分页用哪个函数性能的比较,目前数据量较少,暂时看不出来,不过还是搜集了相关的资料,参考一下

 

http://www.iteye.com/topic/550012

 

分享到:
评论

相关推荐

    oracle中rownum和row_number()

    主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下。

    Oracle数据库rownum和row_number的不同点

    在Oracle中,有一个很有趣的东西,那就是rownum。当你从某个表中查询数据的时候,返回的结果集中都会带有rownum这个字段,而且有时候也可以使用rownum进行一些条件查询

    深入探讨:oracle中row_number() over()分析函数用法

    row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。 rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) dense_rank()也是连续排序,有两个第二名时仍然跟

    Oracle中使用Rownum分页详细例子

    主要介绍了Oracle中使用Rownum分页详细例子,本文将分别展示使用rownum伪列和row_number()分析函数来完成Oracle数据分页操作的具体使用方法,需要的朋友可以参考下

    Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

    是第3名 LAG 表示 分组排序后 ,组内后面一条记录减前面一条记录的差,第一条可返回 NULL BTW: EXPERT ONE ON ONE 上讲的最详细,还有很多相关特性,文档看起来比较费劲 row_number()和rownum差不多,功能更强一点...

    精髓Oralcle讲课笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...

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

    oracle的框架主要由物理结构、逻辑结构、内存分配、后台进程、oracle例程、系统改变号 (System Change Number)组成  物理结构 物理结构包含三种数据文件: 1) 控制文件 2) 数据文件 3) 在线重做日志文件  ...

    Oracle开发之分析函数(Rank, Dense_rank, row_number)

    在前面一篇《Oracle开发之分析函数简介Over》,我们认识了分析函数的基本应用,现在我们再来考虑下面几个问题: ①对所有客户按订单总额进行排名 ②按区域和客户订单总额进行排名 ③找出订单总额排名前13位的客户 ④...

    Oracle事例

    select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b ) where row_id between 15 and 20 15、对公共授予访问权 grant select on 表名 to public; create public synonym 同义词名 ...

    MySQL中在查询结果集中得到记录行号的方法

    Oracle 中可以使用标准方法(8i版本以上),也可以使用非标准的 ROWNUM ; MS SQL Server 则在 2005 版本中提供了 ROW_NUMBER() 函数;但在 MySQL 中似乎还没有这样的系统自带功能。虽然 LIMIT 可以很方便的对返回...

    MySQL rownumber SQL生成自增长序号使用介绍

    MySQL 几乎模拟了 Oracle,SQL Server等商业数据库的大部分功能,函数。但很可惜,到目前的版本(5.1.33)为止,仍没有实现ROWNUM这个功能

    oracle从一个表中获取数据更新到另一个表(两表无关联关系)

    oracle从一个表中获取数据更新到另一个表(两表无关联关系) 想到的唯一解决办法 行数定义时要和被修改的数据表的行数相同 declare cursor cor is select m.id from 提供数据表 m where rownum&lt;=行数; n_...

Global site tag (gtag.js) - Google Analytics