`
lw1130
  • 浏览: 21183 次
  • 性别: Icon_minigender_1
  • 来自: nanjing
社区版块
存档分类
最新评论

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不能以任何表的名称作为前缀。
举例说明:
例如表:student(学生)表,表结构为:
ID       char(6)      --学号
name    VARCHAR2(10)   --姓名
create table student (ID char(6), name VARCHAR2(100));
insert into sale values('200001',‘张一’);
insert into sale values('200002',‘王二’);
insert into sale values('200003',‘李三’);
insert into sale values('200004',‘赵四’);
commit;
(1) rownum 对于等于某值的查询条件
如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
SQL> select rownum,id,name from student where rownum=1;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         1 200001 张一
SQL> select rownum,id,name from student where rownum =2;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
(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和排序
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
SQL> select rownum ,id,name from student order by name;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         3 200003 李三
         2 200002 王二
         1 200001 张一
         4 200004 赵四
可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询
SQL> select rownum ,id,name from (select * from student order by name);
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         1 200003 李三
         2 200002 王二
         3 200001 张一
         4 200004 赵四
这样就成了按name排序,并且用rownum标出正确序号(有小到大)

以上转自http://tenn.iteye.com
分享到:
评论

相关推荐

    ROWNUM的使用技巧

    ROWNUM 的使用技巧和陷阱 ROWNUM 是 Oracle 中的一种伪列,它可以根据返回记录生成一个序列化的数字。利用 ROWNUM,我们可以生产...ROWNUM 是一个非常有用的技巧,但是需要注意一些使用注意事项,以免掉入“陷阱”。

    Oracle rownum.docx

    Oracle的ROWNUM是一个非常重要的概念,它在数据库查询中起到...但同时也需要注意其在不同情况下的行为差异,特别是在与ORDER BY结合使用时的注意事项。在实际应用中,合理利用ROWNUM能显著提高数据检索的效率和准确性。

    oracle rownum 使用技术.pdf

    #### 三、注意事项 1. **ROWNUM计算时机**:ROWNUM在执行计划的早期阶段就被计算,因此在进行排序操作之前就需要确定。 2. **ORDER BY与ROWNUM的交互**:如果需要先排序再限制结果数量,最好使用子查询的方法,确保...

    oracle中取中间记录的方法

    ##### 注意事项 - 在使用`ROWNUM`时,必须确保查询结果是经过排序的,否则得到的结果可能会不准确。 - `MINUS`操作符对两个查询结果集中的列名顺序有严格要求,如果列名顺序不同,将会导致错误的结果。 - 使用这种...

    Oracle中ROWNUM的使用技巧.docx

    以下是一些关于ROWNUM的使用技巧和注意事项: 1. **Top N 结果输出**:在不考虑特定排序的情况下,我们可以直接通过`WHERE ROWNUM 来获取前N条记录。然而,如果需要基于特定排序获取Top N,这种方法可能会出现问题...

    MYSQL到ORACLE程序迁移的注意事项

    MySQL到Oracle数据库迁移的过程中,需要注意一系列的差异和调整,以确保迁移后的应用程序能够正常运行。以下是一些关键点的详细说明: 1. **自动增长的数据类型处理**: 在MySQL中,`AUTO_INCREMENT`字段自动分配...

    PostgreSQL rownum实现方法(兼容oracle)

    在Oracle数据库中,`ROWNUM`是一个非常重要的概念,它是一个虚拟列,每次查询时根据行的输出顺序自增1,常用于限制查询结果的数量,比如实现分页或生成序列值。然而,PostgreSQL并不直接支持`ROWNUM`这样的机制。当...

    数据库移植注意事项(SQLSERVER,ORACLE,DB2).txt

    ### 数据库移植注意事项(SQLSERVER, ORACLE, DB2) 在进行数据库移植时,尤其是在不同的数据库管理系统之间迁移数据和逻辑时,有许多重要的注意事项和技术差异需要特别关注。本文将根据提供的文件内容,详细介绍在...

    oracle帮助文档

    6. **限制与注意事项**: - `ROWNUM`不能以基表的名称作为前缀,例如`SELECT t1.ROWNUM`是非法的。 - `ROWNUM`是Oracle从8版本开始引入的,主要用作分页查询,例如`SELECT * FROM tord WHERE ROWNUM 可以获取表`...

    oralce入门级帮助文档,里面提供了分页,存储过程,数据库选择,表空间,oracle数据库基础语法,注意事项实例

    Oracle提供了ROWNUM伪列来实现分页,通过在查询语句中设置WHERE子句限制ROWNUM的范围,可以获取指定页码的数据。例如,要获取第N页的数据,可以先计算出该页的第一条记录的ROWNUM值,然后在查询中使用BETWEEN来限定...

    oracle 分页语句

    #### 实现注意事项 - **性能考虑**: - 使用`ROWNUM`进行分页时,需要注意其可能带来的性能问题。当表中的数据量非常大时,如果直接对整个表应用`ROWNUM`,可能会导致性能下降。 - 一种优化方法是在使用`ROWNUM`...

    oracle 数据库java驱动 ojdbc

    6. 注意事项: - 驱动版本与数据库版本匹配:使用对应的ojdbc驱动才能保证兼容性和最佳性能。 - 安全性:避免SQL注入,使用PreparedStatement并参数化SQL。 - 错误处理:正确捕获并处理SQLException,确保程序...

    17.Oracle伪列1

    三、rowid的局限性和注意事项 - 兼容性:rowid是Oracle特有的,不适用于其他数据库系统,跨数据库迁移时需注意。 - 物理位置:rowid记录的数据物理位置可能会因数据移动、备份或恢复而改变,依赖rowid的持久性可能...

    oracle面试题

    **注意事项**: - 在编写存储过程时,需要注意异常处理。 - 调用存储过程时,参数类型和顺序需要与存储过程中定义的一致。 #### 四、Oracle DDL/DML/DCL命令 - **DDL(Data Definition Language)**:数据定义语言...

    SQL转Oracle的方法

    ### SQL Server 转换至 Oracle 的方法及注意事项 在 IT 领域,数据库迁移是一项常见的任务,尤其是在从 SQL Server 迁移到 Oracle 的场景下。这种迁移涉及到多个层面的技术挑战,包括但不限于语法差异、数据类型...

    Convert Mysql to Oracle

    在IT行业中,数据库管理系统(DBMS)的选择往往取决于项目需求、性能、安全性等因素。Mysql和Oracle都是业界广泛使用的...在实际使用中,用户应详细阅读工具的文档,了解操作步骤和注意事项,以确保迁移的成功和安全。

    从Sql Server迁移到 Oracle 过程中代码需要调整的地方

    以下是一些关键的转换点和注意事项: 1. **NULL值处理**: - SQL Server中,空字符串`''`和NULL是两个独立的值,而在Oracle中,空字符串被视为NULL。 - 在比较时,SQL Server允许`field1 = NULL`,而Oracle则要求...

    VBScript直接连接Oracle

    #### 五、注意事项 - **安全性**:在实际部署中应考虑使用更安全的方式传递用户名和密码,避免硬编码。 - **错误处理**:添加适当的错误处理逻辑,确保脚本在遇到问题时能够优雅地处理异常情况。 - **性能优化**:...

    oracle批量删除数据

    #### 三、注意事项 - **事务管理**:使用`PRAGMA AUTONOMOUS_TRANSACTION;`确保每次循环都可以独立提交,避免因异常导致的数据不一致。 - **性能考虑**:虽然这种方法提高了删除速度,但在高并发环境下可能会对...

Global site tag (gtag.js) - Google Analytics