`

[转]如何正确利用Rownum来限制查询所返回的行

阅读更多

如何正确利用Rownum来限制查询所返回的行数? 
软件环境: 
1、Windows NT4.0+ORACLE 8.0.4
2、ORACLE安装路径为:C:\ORANT

含义解释: 
1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,
  依此类推,这个伪字段可以用于限制查询返回的总行数。
2、rownum不能以任何基表的名称作为前缀。 
使用方法: 
现有一个商品销售表sale,表结构为:
month    char(6)      --月份
sell    number(10,2)   --月销售金额

create table sale (month char(6),sell number); 
insert into sale values('200001',1000); 
insert into sale values('200002',1100); 
insert into sale values('200003',1200); 
insert into sale values('200004',1300); 
insert into sale values('200005',1400); 
insert into sale values('200006',1500); 
insert into sale values('200007',1600); 
insert into sale values('200101',1100); 
insert into sale values('200202',1200); 
insert into sale values('200301',1300); 
insert into sale values('200008',1000); 
commit; 

 

select rownum,month,sell from sale where rownum=1;
-- 可以用在限制返回记录条数的地方,保证不出错,如:隐式游标

  ROWNUM   MONTH    SELL
   -----------  --------    --------- 
      1          200001    1000

 

select rownum,month,sell from sale where rownum=2;
-- 1以上都查不到记录

  没有查到记录

 

select rownum,month,sell from sale where rownum>5; 
-- 由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件不成立,查不到记录

 没有查到记录

 

select rownum,month,sell from sale where rownum<4;

   只返回前3条纪录 
   ROWNUM MONTH  SELL
    ---------   ---------   -------
        1       200001    1000
        2       200002    1100
        3       200003    1200


    如何用rownum实现大于、小于逻辑?(返回rownum在4—10之间的数据)(minus操作,速度会受影响)

select rownum,month,sell from sale where rownum<10 
minus 
select rownum,month,sell from sale where rownum<5; 

   ROWNUM MONTH    SELL
   -----------  ---------    ---------
        5        200005      1400
        6        200006      1500
        7        200007      1600
        8        200101      1100
        9        200202      1200 

    想按日期排序,并且用rownum标出正确序号(有小到大)

select rownum,month,sell from sale order by month;

    ROWNUM  MONTH  SELL
    ----------   ---------   --------- 
       1          200001      1000 
       2          200002      1100 
       3          200003      1200 
       4          200004      1300 
       5          200005      1400 
       6          200006      1500 
       7          200007      1600 
      11         200008      1000 
       8          200101      1100 
       9          200202      1200 
      10         200301      1300 
    查询到11记录.
    可以发现,rownum并没有实现我们的意图,系统是按照记录入库时的顺序给记录排的号,rowid也是顺序分配的

 

select rowid,rownum,month,sell from sale order by rowid; 

     ROWID                          ROWNUM MONTH       SELL 
    --------------------------      -----------  ---------    --------- 
    000000E4.0000.0002         1        200001      1000 
    000000E4.0001.0002         2        200002      1100 
    000000E4.0002.0002         3        200003      1200 
    000000E4.0003.0002         4        200004      1300 
    000000E4.0004.0002         5        200005      1400 
    000000E4.0005.0002         6        200006      1500 
    000000E4.0006.0002         7        200007      1600 
    000000E4.0007.0002         8        200101      1100 
    000000E4.0008.0002         9        200202      1200
    000000E4.0009.0002        10       200301      1300
    000000E4.000A.0002        11       200008      1000
    查询到11记录. 

    正确用法,使用子查询

select rownum,month,sell from (select month,sell from sale group by month,sell) where rownum<13;

   ROWNUM MONTH    SELL
   --------- ------------    ---------
        1     200001       1000
        2    200002        1100
        3    200003        1200
        4    200004        1300
        5    200005        1400
        6    200006        1500
        7    200007        1600
        8    200008        1000
        9    200101        1100
       10   200202        1200
       11   200301        1300

    按销售金额排序,并且用rownum标出正确序号(有小到大)

select rownum,month,sell from (select sell,month from sale group by sell,month) where rownum<13; 

    ROWNUM  MONTH       SELL
    ----------    ---------     ---------
        1          200001      1000
        2          200008      1000
        3          200002      1100
        4          200101      1100
        5          200003      1200
        6          200202      1200
        7          200004      1300
        8          200301      1300
        9          200005      1400
       10         200006      1500
       11         200007      1600
    查询到11记录. 

    利用以上方法,如在打印报表时,想在查出的数据中自动加上行号,就可以利用rownum。
    返回第5—9条纪录,按月份排序

select * from (select rownum row_id ,month,sell  
from (select month,sell from sale group by month,sell))  
where row_id between 5 and 9; 

     ROW_ID MONTH      SELL
     ----------  ----------    ----------
         5        200005       1400
         6        200006       1500
         7        200007       1600
         8        200008       1000
         9        200101       1100

分享到:
评论

相关推荐

    rownum用法(不使用minus)

    尝试使用 `rownum &gt; n` (n 为某个正整数) 来查询时,由于 `rownum` 从 1 开始,直接使用这样的条件将不会返回任何结果。这是因为 Oracle 认为 `rownum &gt; n` (n &gt; 1) 的条件始终为假。 **示例 SQL**: ```sql SELECT ...

    oracle rownum和distinct

    ROWNUM 是 Oracle 系统赋予查询返回的行的编号,它是从 1 开始的,这个伪字段可以用于限制查询返回的总行数。但是,ROWNUM 的真正含义往往被人误解。很多人认为 ROWNUM 是在查询结果集整个返回后再分配的顺序编号,...

    ORACLE 中ROWNUM用法总结

    尝试使用`ROWNUM &gt; N`或`ROWNUM &gt;= N`来获取特定范围的行,可能会导致意外的结果。这是因为在查询过程中,一旦某一行不符合`ROWNUM &gt; N`条件,后续的行号仍会被重置为1,从而无法达到预期的效果。 **解决方法**:...

    Oracle rownum.docx

    正确使用ROWNUM可以帮助我们限制返回的结果集大小,进行分页,以及在特定条件下选择行。但同时也需要注意其在不同情况下的行为差异,特别是在与ORDER BY结合使用时的注意事项。在实际应用中,合理利用ROWNUM能显著...

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

    总结一下,`ROWNUM`在Oracle中用于限制查询返回的行数,但它的行为并不直观,特别是在与`ORDER BY`一起使用时。理解`ROWNUM`的生成原理以及其与`ORDER BY`的交互对于优化SQL查询和获取预期结果至关重要。在实际的...

    oracle的rownum用法

    - 当需要限制返回的行数时,可以结合`WHERE ROWNUM 和`ORDER BY`一起使用,以获取前n行。 - 若要选择特定范围的行,可以使用子查询和临时变量,例如`SELECT * FROM (SELECT ..., ROWNUM r FROM table WHERE ...) ...

    解析rownum

    使用`ROWNUM &gt; n`查询条件时,将无法直接获取从第n行开始的记录,因为`ROWNUM`始终从1开始,所以`ROWNUM &gt; n`的条件对于所有行来说都是不满足的。要获取第n行之后的记录,我们需要使用子查询,为`ROWNUM`赋予别名,...

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

    在标题和描述中提到的示例,查询前20名员工信息,正确的方法是先对数据进行排序,然后再使用ROWNUM进行限制。例如: ```sql SELECT ROWNUM, first_name, salary FROM ( SELECT first_name, salary FROM employees...

    oracle中rownum的用法及解说

    - 当我们需要限制返回的结果集数量时,可以结合`ROWNUM`和子查询来实现。 - **示例**: ```sql SELECT * FROM (SELECT ROWNUM NO, ID, NAME FROM STUDENT WHERE ROWNUM ) WHERE NO &gt;= 2; ``` 这条语句将返回表...

    oracle rownum 使用技术.pdf

    然而,在对结果进行排序后使用ROWNUM获取Top N数据时,需要注意一些潜在的问题。这是因为ROWNUM在执行计划的早期阶段就被计算,而ORDER BY子句是在后期阶段才被处理。这意味着即使对数据进行了排序,ROWNUM仍然可能...

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

    综上所述,Oracle的Rownum特性在JSP分页显示的实现中起到了关键作用,通过巧妙地使用Rownum,可以实现高效、流畅的数据库查询和网页展示。同时,理解Rownum的工作原理,对于优化查询性能和编写高效的SQL语句至关重要...

    Oracle中使用伪列rownum实现分页查询

    在分页查询中,我们可以巧妙地利用`ROWNUM`来限制返回的行数,从而实现分页。 例如,如果你想要获取`EMP`表中薪水最高的前三名员工的信息,你可以编写如下的SQL语句: ```sql SELECT * FROM (SELECT * FROM emp ...

    ORACLE数据库中ROWNUM用法详解

    Oracle数据库中的ROWNUM是一个非常重要的概念,特别是在处理...正确使用ROWNUM可以提高查询效率,避免不必要的性能问题。通过深入理解ROWNUM的工作原理,开发者能够更好地设计和优化数据库查询,以满足复杂的业务需求。

    sql语句查询指定的条数

    - 如果需要结合其他查询条件使用`ROWNUM`,可以先使用一个子查询来确保`ROWNUM`的正确应用: ```sql SELECT * FROM (SELECT * FROM tab ORDER BY column_name) WHERE ROWNUM ; ``` #### SQL Server SQL Server...

    oracle数据库技术文档

    包内目录: 1、ORACLE 体系结构 2、sql_plus函数 3、sqlplus常用命令 4、sql 5、锁和表分区 6、数据库对象 7、oop 8、PLSQL ...13、如何正确利用rownum来限制查询所返回的行数 每个目录都是单个文件

    基于Oracle数据库的分页显示中SQL复杂查询结果集总行与数据正确性控制.pdf

    Rownum值从1开始,当Rownum值大于查询条件指定的值时,查询将不再返回更多的行。需要特别注意的是,当Rownum用在where子句中时,不能单独使用大于(&gt;)、大于等于(&gt;=)和between and等条件,因为这些条件对Rownum不...

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

    例如,可以使用ROWNUM 来获取前N行数据。在大数据量的查询中,巧妙使用ROWNUM可以提高查询效率,但需要注意,ROWNUM的值是在查询执行时动态生成的,不是预定义的。 3. **Java与Oracle数据库交互**:Java通过JDBC...

    oracle的rownum深入解析

    Oracle的ROWNUM是一个非常重要的概念,它在数据库查询中用于限制返回的结果集数量,尤其是在处理大量数据时,如实现分页功能。ROWNUM是一个伪列,即它并不是表中的实际列,而是Oracle在执行查询时动态生成的一个...

    嵌套查询总结例子

    这种操作顺序可能会导致分页结果的混乱,例如,在需要按特定字段排序并返回前几条记录的场景下,如果直接使用ROWNUM进行限制,可能会得到先未排序后排序的记录,而非真正意义上的“前几条”。 #### 三层嵌套查询...

    oracle分页操作

    Oracle数据库中的分页查询是大数据量检索时必不可少的技巧,它可以帮助用户有效地管理查询结果,只返回所需的页面数据,从而减少网络传输和内存消耗。在Oracle中,分页查询通常利用`ROWNUM`伪列来实现。`ROWNUM`是一...

Global site tag (gtag.js) - Google Analytics