`

Oracle学习:Oracle中rownum的使用技巧

阅读更多
解析oracle的rownum 
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。 
举例说明: 
例如表:student(学生)表,表结构为:

sql 代码
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 代码
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 代码
SQL> select rownum,id,name from student where rownum >2;    
ROWNUM ID     NAME   
---------- ------ ---------------------------------------------------    

那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。 

sql 代码
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 代码
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 代码
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 代码
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 代码
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标出正确序号(有小到大) 

一个例子 
取出100-150条记录,

sql 代码
select tname,tabtype from (    
   select tname,tabtype,rownum rn from tab where rownum <= 150    
)    
where rn >= 100;    

如果按某一列排序的话,好像就又复杂一些。 

sql 代码
select tname,tabtype from (select tname,tabtype,rownum rn from(select * from tab order by tname)where rownum <=150) where rn>=100;    

要点就是要把数据先处理完成,再用rownum来处理。

 

使用rownum返回6到10行的数据:

有三种方法:

select * from (select rownum n,e.* from emp e where rownum<=10) t where t.n>5


select * from (select rownum n,e.* from emp e ) t where t.n between 6 and 10

select rownum,e.* from emp e where rownum<=10
minus 
select rownum,t.* from emp t where rownum<=5

 

分享到:
评论

相关推荐

    ROWNUM的使用技巧

    ROWNUM 是 Oracle 中的一种伪列,它可以根据返回记录生成一个序列化的数字。利用 ROWNUM,我们可以生产一些原先难以实现的结果输出,但是因为它是伪列的特殊性,在使用时需要注意一些事项,以免掉入“陷阱”。 特殊...

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

    本文将详细介绍 Oracle 中 ROWNUM 的使用方法,并与 SQL Server 中相应的功能进行对比分析。 #### Oracle ROWNUM 基础用法 1. **ROWNUM 的默认行为:** - 在 Oracle 中,ROWNUM 默认从 1 开始计数,对于每一行...

    Oracle中rownum的使用

    Oracle中rownum的使用

    Oracle中ROWNUM的使用技巧.docx

    例如,要获取第N到M条记录,可以先选择`WHERE ROWNUM ,然后在外部查询中使用`WHERE ROWNUM &gt; N`。另外,也可以使用`BETWEEN N AND M`来获取相同的结果。 3. **陷阱与注意事项**:ROWNUM的生成是基于查询的执行计划...

    ORACLE 中ROWNUM用法总结

    `ROWNUM`在Oracle中是一个强大但需谨慎使用的工具。正确理解其行为逻辑,特别是在处理比较运算符时,是至关重要的。通过合理的设计查询结构,可以充分发挥`ROWNUM`的优势,实现在大型数据集上的高效查询和分页功能。...

    oracle_SQL中rowid与rownum的使用

    注意:在Oracle 12c及更高版本中,可以使用`FETCH FIRST N ROWS ONLY`来代替`ROWNUM`进行分页。 总结,`ROWID`和`ROWNUM`在Oracle SQL中各自扮演着不可或缺的角色。`ROWID`提供了直接访问数据的快速途径,而`ROWNUM...

    oracle_SQL中ROWID与ROWNUM的使用

    ### Oracle SQL中ROWID与ROWNUM的使用 #### ROWNUM 的使用——TOP-N 分析 在 Oracle SQL 中,`ROWNUM` 是一种特殊的伪列,用于标识查询结果集中的行编号。它常用于实现 TOP-N 查询,即返回结果集中满足特定条件的...

    解析oracle的rownum

    在 Oracle 中,我们可以使用 ROWNUM 来查找前 N 个数据。例如,如果我们想要找到学生表中第一条学生的信息,可以使用 ROWNUM=1 作为条件。 ```sql SQL&gt; select rownum,id,name from student where rownum=1; ``` ...

    oracle rownum 学习

    Oracle ROWNUM学习 Oracle ROWNUM是Oracle系统顺序分配的行号,用于限制查询返回的总行数。ROWNUM是一个伪字段,不能以任何表的名称作为前缀。下面是对ROWNUM的详细讲解: 一、ROWNUM的基本用法 ROWNUM是一个伪...

    对于 Oracle 的 rownum 问题

    ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用&gt;,&gt;=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的...

    在oracle中灵活使用Rownum和rowId

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

    oracle rownum和distinct

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

    oracle中rownum的用法及解说

    - 在使用`ORDER BY`时,如果直接在查询中使用`ROWNUM`,则可能会导致结果集的顺序与预期不符。 - **示例**: ```sql SELECT ROWNUM, ID, NAME FROM STUDENT ORDER BY NAME; ``` 上述查询将根据`NAME`字段对表`...

    Oracle学习笔记(rownum和rowid)

    Oracle学习笔记(rownum和rowid),有具体的代码案例讲解rownum和rowid

    oracle中取中间记录的方法

    本文详细介绍了如何在Oracle数据库中使用`MINUS`操作符配合`ROWNUM`伪列来获取数据表中的中间记录。这种方法虽然简单有效,但在实际应用时还需要注意排序和性能等问题。对于需要频繁处理这类查询的场景,可以考虑...

    oracle中rownum的用法

    如果您在查询中使用了`ORDER BY`子句,那么`ROWNUM`将按照排序后的结果进行编号。例如: ```sql SELECT ROWNUM, ID, NAME FROM STUDENT ORDER BY NAME; ``` 这条语句将根据`NAME`字段对`STUDENT`表中的数据进行排序...

    oracle_SQL-rowid--rownum.zip_oracle

    同时,从提供的压缩文件名来看,除了`oracle_SQL中rowid与rownum的使用.doc`直接相关外,其他文件如`ssi2配置整合步骤.doc`、`Spring事物配置.doc`、`Struts2防止表单重复提交.doc`、`SSH改造DAO.doc`涉及的是其他...

    关于oracle的rownum

    例如,使用 select rownum,c1 from t1 where rownum &gt; 10,这时候在您的头脑中应该是想得到表中后面 10 条记录,但实际上却什么也不会显示出来。这是因为 ROWNUM 是对结果集加的一个伪列,先查到结果集之后再加上去...

    rownum用法(不使用minus)

    `rownum` 是 Oracle 数据库中的一个特殊字段,主要用于给查询结果集中的每一行分配一个唯一的序号,该序号从 1 开始递增。`rownum` 的主要用途之一是用于实现分页查询,即控制查询结果的数量。 #### 二、rownum与...

    oracle的rownum用法

    5. 在子查询中使用`ROWNUM`并将其传递到外部查询中时,`ROWNUM`的顺序取决于外部查询如何使用它。如果外部查询也依赖于`ROWNUM`,则必须谨慎处理,以确保正确过滤或排序结果。 为了更有效地利用`ROWNUM`,可以考虑...

Global site tag (gtag.js) - Google Analytics