`
slikel
  • 浏览: 66067 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

对oracle 中rownum 的理解

 
阅读更多

在Oracle中,要按特定条件查询前N条记录,用个rownum就搞定了。
select * from emp where rownum <= 5
而且书上也告诫,不能对rownum用">",只能使用"<=","<","!=",这也就意味着,如果你想用
select * from emp where rownum > 5
则是失败的。要知道为什么会失败,则需要了解rownum背后的机制:
1 Oracle executes your query.

2 Oracle fetches the first row and calls it row number 1.

3 Have we gotten past row number meets the criteria? If no, then Oracle discards the row, If yes, then Oracle return the row.

4 Oracle fetches the next row and advances the row number (to 2, and then to 3, and then to 4, and so forth).

5 Go to step 3.

了解了原理,就知道rownum>不会成功,因为在第三步的时候查询出的行已经被丢弃,第四步查出来的rownum仍然是1,这样永远也不会成功。

同样道理,rownum如果单独用=,也只有在rownum=1时才有用。

 

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

 

     rownum是伪劣,该列只存在于查询结果集中,并且结果集中rownum没有1就不会有2。

     当我们在执行select * from student where rownum!=5 时,oracle会给结果集加上rownum这一伪列,然后根据rownum!=5这个条件开始过滤,当遇到rownum!=5为false时,过滤会终止,将前面符合条件的记录返回给用户。

 

 

实现分页:

 

 

欢迎纠正

如何实现分页提取记录
方法1:oracle的ROWNUM伪列返回查询的行序号。
  例如要查询表的前10条记录,可以使用
  select * from tablename where ROWNUM<=10
  但是要返回第11-第20条记录,尝试以下的语句
  select * from tablename where ROWNUM<=20 and ROWNUM>=11;
  这个人报错。返回0条记录。因为ROWNUM是伪列,不能用>=条件
  使用以下方法可以查询第11-第20条记录
  select * from
  (select ROWNUM rn ,t.* from tablename t where ROWNUM<=20) where rn>=11;
方法2:使用分析函数ROW_NUMBER实现分页
  select * from (select ROW_NUMBER() OVER (ORDER BY id) rn,t.* from tablename t) 
    where rn between 11 and 20;
方法3:使用集合运算MINUS实现分页
  select * from tablename where ROWNUM<=20 MINUS
  select * from tablename where ROWNUM<11;
点评:方法1在查找前几页时速度很快。但在数据量很大时,最后几页速度比较慢。
方法2查询效率比较稳定,是推荐使用的方法。
方法3只适合查询结果在200行以内的情况,记录数很多时会导致oracle错误,需谨慎使用。
分享到:
评论

相关推荐

    对于 Oracle 的 rownum 问题

    一般代码中对结果集进行分页就是这么干的。 另外:rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,...

    ORACLE 中ROWNUM用法总结

    在Oracle数据库中,`ROWNUM`是一个非常有用的伪列,用于限制查询结果的行数,尤其是在处理大数据量或进行分页查询时。然而,`ROWNUM`的使用并不直观,尤其是当涉及到比较运算符(如`&gt;`, `&gt;=`, `=`等)时,容易引发...

    oracle rownum和distinct

    "Oracle 中的 ROWNUM 和 DISTINCT" Oracle 中的 ROWNUM 和 DISTINCT 是两个非常重要的关键词,它们在查询数据时发挥着至关重要的作用。然而,许多开发者在使用这两个关键词时,却常常会遇到一些不太理解的地方,...

    oracle中rownum的用法

    ### Oracle中的ROWNUM使用详解 #### 一、ROWNUM简介 在Oracle数据库中,`ROWNUM`是一个非常有用的伪列,它为查询结果中的每一行分配一个唯一的行号。这个行号从1开始,每增加一行,行号就递增1。`ROWNUM`对于数据...

    Oracle中ROWNUM的使用技巧.docx

    为了避免这个问题,可以先对查询结果进行排序,然后在外部查询中使用ROWNUM,如子查询或连接。 2. **分页查询**:ROWNUM可用于实现分页查询,展示数据的特定页码。一个常见方法是使用嵌套查询,先为所有记录分配...

    oracle的rownum用法

    理解`ROWNUM`的工作原理对于编写高效的Oracle查询至关重要,尤其是在处理大型数据集时,能够帮助我们避免不必要的性能问题。正确使用`ROWNUM`可以让我们更好地控制查询结果的范围,从而实现更精细化的数据处理。

    Oracle rownum.docx

    总的来说,理解并掌握Oracle中的ROWNUM用法对于编写高效、精确的SQL查询至关重要。正确使用ROWNUM可以帮助我们限制返回的结果集大小,进行分页,以及在特定条件下选择行。但同时也需要注意其在不同情况下的行为差异...

    在oracle中灵活使用Rownum和rowId

    ### 在Oracle中灵活使用Rownum和RowId 在Oracle数据库中,`ROWNUM` 和 `ROWID` 是两个非常重要的概念,它们可以帮助我们在查询数据时实现更灵活的数据管理。本文将详细介绍这两个概念的区别及其使用方法,并通过...

    Oracle利用rownum查询出部分数据[归类].pdf

    在Oracle数据库中,`ROWNUM`是一个非常重要的概念,它是一个伪列,用于标识查询结果集中每一行的位置。`ROWNUM`的值从1开始,每次查询时都会为每行新生成一个递增的整数。然而,`ROWNUM`的行为并不总是如我们所预期...

    Oracle--ROWNUM.rar_oracle

    需要注意的是,`ROWNUM`的筛选是在数据读取过程中进行的,而非对整个数据集进行排序后筛选,所以如果你没有指定`ORDER BY`子句,返回的结果顺序可能是不确定的。 在进行分页查询时,`ROWNUM`结合`ROWCOUNT`或者`...

    ORACLE数据库中ROWNUM用法详解

    Oracle数据库中的ROWNUM是一个非常重要的概念,特别是在处理大型数据集时进行分页查询。ROWNUM是一个伪列,意味着它并不是数据库表中实际存在的列,而是Oracle数据库在执行查询时动态生成的一个序列号,用于标记查询...

    oracle中取中间记录的方法

    本文将详细介绍如何利用Oracle中的`MINUS`操作符以及`ROWNUM`伪列来实现这一功能。 #### ROWNUM伪列简介 在介绍具体方法之前,我们首先了解一下`ROWNUM`伪列的基本概念。`ROWNUM`是Oracle提供的一种特殊的伪列,它...

    mysql类似oracle rownum写法实例详解

    理解这些技巧对于那些习惯于 Oracle SQL 而又需要在 MySQL 中工作的开发者来说至关重要。希望这些实例和解释能帮助到正在学习和工作中遇到此类问题的朋友。记得在实践中不断尝试和优化,以适应不同的数据库系统。

    oracle_SQL中rowid与rownum的使用

    在Oracle SQL中,`ROWID`和`ROWNUM`是两个非常重要的概念,它们在数据库查询和数据操作中起着至关重要的作用。本文将详细探讨这两个特性,包括它们的定义、用途以及如何在实际场景中有效利用它们。 一、ROWID详解 `...

    Oracle Rownum的使用与JSP分页显示的实现.pdf

    Oracle数据库中的Rownum是一个非常重要的特性,尤其在处理大量数据和实现分页显示时显得极其关键。Rownum是一个伪列,它并不是数据库表中实际存在的列,而是Oracle在执行查询时动态生成的,用来表示查询结果集中每一...

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

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

    oracle_SQL-rowid--rownum.zip_oracle

    在实际开发中,理解并合理利用`ROWID`和`ROWNUM`,可以有效地提升Oracle数据库的管理和查询效率。同时,从提供的压缩文件名来看,除了`oracle_SQL中rowid与rownum的使用.doc`直接相关外,其他文件如`ssi2配置整合...

    oracle 使用rownum的三种分页方式

    总的来说,理解并掌握如何在Oracle中使用`ROWNUM`进行分页查询是数据库操作中的一个重要技能。在选择分页策略时,需要考虑到性能、可读性和维护性等因素。在实际工作中,根据数据量、查询复杂度以及数据库性能优化的...

    oracle的rownum深入解析

    综上所述,理解Oracle的ROWNUM特性是高效地处理大量数据的关键。正确地使用ROWNUM,结合适当的排序和子查询,可以有效地实现数据过滤和分页,提高查询性能。在编写SQL语句时,应根据具体需求灵活运用ROWNUM,以确保...

    oracle中rownum和row_number()

    在Oracle数据库中,`ROWNUM` 和 `ROW_NUMBER()` 是两个非常重要的概念,它们都用于为查询结果集的每一行分配一个唯一的数字。然而,两者在使用方式和功能上存在一定的差异。 首先,`ROWNUM` 是Oracle的一个内置伪列...

Global site tag (gtag.js) - Google Analytics