`
slikel
  • 浏览: 64670 次
  • 性别: 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和distinct

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

    Oracle中ROWNUM的使用技巧.docx

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

    oracle的rownum用法

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

    Oracle rownum.docx

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

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

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

    oracle_SQL中rowid与rownum的使用

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

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

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

    MLDN魔乐科技_Oracle课堂19_修改约束、ROWNUM

    在Oracle数据库管理中,理解和掌握如何修改约束以及使用ROWNUM是非常重要的技能。本篇将深入探讨这两个核心概念,并通过MLDN魔乐科技的Oracle课堂19视频课程进行详细讲解。 首先,我们来讨论"修改约束"。在Oracle中...

    MLDN魔乐科技JAVA培训_Oracle课堂19_修改约束、ROWNUM.rar

    【标签】"MLDN魔乐科技JAVA培训_Oracle课堂19_修改约束、ROWNUM.rar"标签再次确认了课程的主题,强调了学习者将深入理解Java开发背景下的Oracle数据库管理和查询优化技巧。 【压缩包子文件的文件名称】"MLDN魔乐...

    Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    `ROWID`是Oracle数据库中用于标识表中每行的唯一地址,与`ROWNUM`不同,它反映了数据在磁盘上的实际位置。在需要稳定排序或精确的行顺序时,应考虑使用`ROWID`,但要注意它不应用于业务逻辑,因为它可能会随着表空间...

    对Oracle 排序中的几种常用排序的介绍

    8. **分页查询**:Oracle中通常使用`ROWNUM`进行分页,但要注意`ORDER BY`和`ROWNUM`的配合使用。如果先`ORDER BY`再用`ROWNUM`,可能会导致分页结果不正确。正确的做法是: ```sql select * from ( select ...

    如何在Oracle中实现搜索分页查询

    首先,理解Oracle中的ROWNUM伪列是至关重要的。ROWNUM表示每条记录的行号,它在记录被查询时动态赋值。当尝试直接使用ROWNUM进行范围筛选,如`WHERE ROWNUM BETWEEN 30 AND 49`,这种方法是无效的,因为ROWNUM在第一...

    oracle rowid

    Oracle数据库中的ROWID和ROWNUM是两个非常重要的概念,它们在数据检索和处理中起到关键作用。ROWID是Oracle数据库中用于唯一标识表中每一行的一串字符,它提供了直接访问物理存储位置的能力。ROWID包含数据库块地址...

    oracle的分页查询

    本文将讲解 Oracle 中的分页查询,包括使用 ROWNUM 伪列和 ORDER BY 子句对查询结果进行排序和分页。 一、使用 ROWNUM 伪列实现分页查询 在 Oracle 中,ROWNUP 伪列是一个特殊的列,可以用来实现分页查询。例如,...

    Oracle的SQL分页实践

    在Oracle 9i及更高版本中,可以使用ROWNUM伪列进行分页。ROWNUM是在查询结果集生成时被赋予的数值,表示行的顺序。例如,如果我们想要获取前10条记录,可以使用以下查询: ```sql SELECT * FROM ( SELECT t.*, ...

    Oracle查询语句中rownum与rowid的不同之处分析

    Oracle数据库中,rownum和rowid是两个非常重要的概念,它们在查询语句中有着不同的作用和特性。本文将深入探讨两者的区别,并通过实例解析它们在查询中的行为。 首先,rownum是一个“伪数列”,它并不是数据库中...

    oracle scott 转成mysql 的表学习应用

    例如,Oracle中用ROWNUM伪列进行分页,而在MySQL中则使用LIMIT和OFFSET。 最后,了解和实践这个过程可以帮助我们更好地理解和比较两种数据库系统的特性,从而在实际工作中更高效地处理跨平台的数据迁移和管理任务。...

    Sql语法转换为Oracle语法

    通过分析这些文件,开发者可以理解并实现SQL Server到Oracle的转换工具,这对于数据库迁移、数据同步或者跨平台开发是非常有价值的。在实际操作中,需要注意语法规则的差异,同时对异常和错误进行适当的处理,确保...

    oracle的一些相关网页介绍

    以下是对压缩包文件中涉及的一些Oracle核心概念的详细解释: 1. **ROWID**: ROWID是Oracle数据库中的一个伪列,它是一个唯一的物理地址,标识表中每条记录的具体位置。在"rowid入门详解.html"中,可能涵盖了ROWID...

Global site tag (gtag.js) - Google Analytics