`
Eric.Yan
  • 浏览: 323074 次
  • 性别: 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.rar_oracle

    Oracle数据库系统是世界上最广泛使用的数据库之一,尤其在企业级应用中占据重要地位。在Oracle中,`ROWNUM`是一个非常重要的概念,它...理解并熟练掌握`ROWNUM`的用法,对于提高Oracle数据库的管理和开发能力至关重要。

    Oracle数据库rownum和row_number的不同点

    在Oracle数据库中,`ROWNUM` 和 `ROW_NUMBER()` 是两个不同的概念,它们在处理结果集的排序和分页方面有着显著的区别。 首先,`ROWNUM` 是Oracle数据库中的一个伪列,它在查询执行的过程中动态生成。当查询执行时,...

    oracle中rownum和row_number()

    与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后是先排序再计算行号码。 一、oracle中rownum 用于从查询返回的行的编号,返回的第一行...

    oracle rownum 的使用 和sqlserver有区别的!

    - 在 SQL Server 中,ROW_NUMBER() 函数与 Oracle 中的 ROWNUM 功能类似,但它们之间存在一些关键差异。 - **ROW_NUMBER()** 可以基于特定的排序规则为每行分配一个连续的数字,这使得它在处理有序数据时更为灵活...

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

    通过结合`row_number()`和`LIMIT`或`OFFSET`(在Oracle中是`ROWNUM`和子查询),我们可以轻松地获取数据集的一部分,这对于大型数据集的显示非常有用。 在没有`PARTITION BY`的情况下,`row_number()`将对整个结果...

    MYSQL获取行号row_no

    在数据库操作中,有时候我们需要为查询结果集中的每一行添加一个行号(或行序号),类似于Oracle中的`ROW_NUMBER()`功能。然而MySQL并未直接提供与Oracle完全相同的功能,因此我们需要通过其他方式来实现这一需求。...

    Oracle 存储过程分页

    总结,Oracle 存储过程中的分页实现有很多种方式,包括ROWNUM、ROW_NUMBER()、CTE、FETCH FIRST子句,以及JOIN和游标等。选择哪种方法取决于具体的需求,如数据库版本、性能需求、查询复杂性等因素。正确使用分页...

    oracle-jdbc分页实现(只需传入sql语句即可实现分页)

    Oracle数据库提供了多种方法来实现分页查询,其中包括使用ROWNUM伪列、游标(CURSOR)以及Oracle的高级分页功能如ROW_NUMBER()、RANK()和DENSE_RANK()等。 1. ROWNUM伪列: ROWNUM是Oracle数据库特有的一个伪列,它...

    Oracle row_number() over()解析函数高效实现分页

    Oracle数据库中的`row_number() over()`函数是一种窗口函数,它在处理数据分页时非常有用。这个函数可以为查询结果集中的每一行分配一个唯一的行号,这些行号基于一个指定的排序规则。在此场景中,我们将探讨如何...

    一个Oracle分页的存储过程

    总的来说,Oracle分页的存储过程是解决大数据量查询的一个有效工具,通过封装ROWNUM或ROW_NUMBER()方法,可以灵活地在不同版本的Oracle数据库中实现高效的分页查询。在使用时,应结合具体的业务需求和数据库环境进行...

    Oracle数据库通用的分页存储过程

    Oracle数据库中实现分页查询主要有两种方法:ROWNUM和ROW_NUMBER()函数,这里我们主要讨论通过存储过程实现的通用分页方法。 一、ROWNUM方法 ROWNUM是Oracle数据库中的一个伪列,它会为每一行分配一个唯一的整数,...

    使用row_number()实现分页实例

    例如,在Oracle中,可以使用`ROWNUM`函数,但它有一些不同的行为和限制。 性能方面,`ROW_NUMBER()`通常比传统的`TOP`或`LIMIT`结合`OFFSET`更高效,特别是在处理大数据集时。不过,为了进一步优化性能,可以考虑...

    oracle分页程序的实现

    在Oracle数据库中,常见的分页查询方法有ROWNUM和ROW_NUMBER()函数,以及使用子查询和连接操作来实现分页。 1. ROWNUM方法: ROWNUM是Oracle中的内置伪列,它会为每一行数据生成一个唯一的数字,从1开始递增。但...

    oracle中利用关键字rownum查询前20名员工信息及rownum用法

    Oracle中的ROWNUM是一个重要的查询关键字,它用于限制查询返回的行数。ROWNUM是一个伪列,意味着它不是实际存储在表中的列,而是在执行查询时动态生成的。这个关键字在处理大型数据集时非常有用,可以有效地提高查询...

    解析函数高效实现分页

    ### 解析函数高效实现分页 ...通过以上分析和示例,我们可以看到,在Oracle数据库中利用`ROW_NUMBER()`函数实现分页是一种既简洁又高效的解决方案。它不仅解决了传统分页方法中存在的问题,还大大提高了查询性能。

    Oracle分页

    总结来说,Oracle分页主要通过ROWNUM和ROW_NUMBER()函数实现,其中ROW_NUMBER()更为灵活且适用于复杂场景。合理利用索引和动态分页策略,可以提高查询效率和用户体验。在设计分页系统时,需兼顾性能和用户体验,为...

Global site tag (gtag.js) - Google Analytics