`
jarit
  • 浏览: 144148 次
社区版块
存档分类
最新评论

oracle rownum与order by

阅读更多

对于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标出正确序号(有小到大)
笔者在工作中有一上百万条记录的表,在jsp页面中需对该表进行分页显示, 便考虑用rownum来作,下面是具体方法(每页
显示20条):
   “select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便
取20条记录,然后再 order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询 来实现先排序,后
rownum,方法如下:
   "select * from (select * from tabname order by name) where   rownum<20",但这样一来,效率会较低很多。
   后经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按 该字段排序,然后再rownum;方法不变:
    “select * from tabname where rownum<20 order by name"

取得某列中第N大的行

select column_name from
(select table_name.*,dense_rank() over (order by column desc) rank from table_name)
where rank = &N;
 假如要返回前5条记录:

  select * from tablename where rownum<6;(或是rownum <= 5 或是rownum != 6)
假如要返回第5-9条记录:

select * from tablename
where …
and rownum<10
minus
select * from tablename
where …
and rownum<5
order by name
选出结果后用name排序显示结果。(先选再排序)

注意:只能用以上符号(<、<=、!=)。

select * from tablename where rownum != 10;返回的是前9条记录。
不能用:>,>=,=,Between...and。由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件 不成立,查不到记录.

另外,这个方法更快:

select * from (
select rownum r,a from yourtable
where rownum <= 20
order by name )
where r > 10
这样取出第11-20条记录!(先选再排序再选)

要先排序再选则须用select嵌套:内层排序外层选。
rownum是随着结果集生成的,一旦生成,就不会变化了;同时,生成的结果是依次递加的,没有1就永远不会有2!
rownum 是在 查询集合产生的过程中产生的伪列,并且如果where条件中存在 rownum 条件的话,则:

1: 假如 判定条件是常量,则:
只能 rownum = 1, <= 大于1 的自然数, = 大于1 的数是没有结果的, 大于一个数也是没有结果的
即 当出现一个 rownum 不满足条件的时候则 查询结束   this is stop key!

2: 当判定值不是常量的时候
若条件是 = var , 则只有当 var 为1 的时候才满足条件,这个时候不存在 stop key ,必须进行 full scan ,对每个满足其他where条件的数据进行判定
选出一行后才能去选rownum=2的行……  

分享到:
评论
4 楼 shiguanghui 2013-10-31  
拼命的转载。你都没试过,别人的疑问你也不回答。你转来转去只是制造垃圾。
3 楼 programdolt 2013-07-04  
我最终验证了,和索引建立时间先后没关系

应该必须是“非空索引”,就是说,索引的字段不允许为空。
2 楼 programdolt 2013-07-04  
我感觉,索引必须提前建立,在数据插入前建立,这样才能符合楼主的说法。
最后建表时或表空时建立。

如果表内已经有数据,再后建立索引,应该混乱。

不知道楼主怎么看,楼主可以试试
1 楼 programdolt 2010-06-02  
"后经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按 该字段排序,然后再rownum;方法不变:
    “select * from tabname where rownum<20 order by name""

请问用的是Oracle多少,需要什么参数设置吗。 我这里用的是Oracle9i,不支持啊,依然混乱。

相关推荐

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

    - Oracle 中的 ROWNUM 不受 ORDER BY 影响,即无论是否使用 ORDER BY 子句,ROWNUM 都是从 1 开始计数的。 - 而在 SQL Server 中,如果需要按特定顺序为行分配行号,则必须使用 ORDER BY 与 ROW_NUMBER() 结合的...

    oracle rownum 学习

    SELECT ROWNUM, ID, NAME FROM STUDENT ORDER BY NAME; ``` 可以看出,ROWNUM并不是按照NAME列来生成的序号。系统是按照记录插入时的顺序给记录排的号,ROWID也是顺序分配的。为了解决这个问题,必须使用子查询。 ...

    ORACLE 中ROWNUM用法总结

    SELECT * FROM table ORDER BY some_column ) t WHERE ROWNUM ) WHERE rnum &gt; 10; ``` #### 误区2:`BETWEEN`操作符的使用 同样地,`BETWEEN`操作符在`ROWNUM`的使用上也有局限性。例如,`ROWNUM BETWEEN 1 AND...

    ROWNUM的使用技巧

    order by a.column_name ) a ) b where b.rn ; ``` 这将返回结果中的前 5 条记录,并且正确地排序和取值。 其他实现方式 另外一种实现方式是使用 ROWNUM 和 MINUS 操作符结合来实现分页查询。例如: ```...

    Oracle rownum.docx

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

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

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

    oracle rownum 使用技术.pdf

    2. **ORDER BY与ROWNUM的交互**:如果需要先排序再限制结果数量,最好使用子查询的方法,确保排序后的数据被正确计数。 3. **性能考虑**:在处理大量数据时,应考虑使用其他方法如窗口函数(如RANK()、ROW_NUMBER()...

    oracle中rownum的用法及解说

    - 为了确保`ROWNUM`的值与`ORDER BY`的结果一致,应先进行排序,再计算`ROWNUM`。 - **示例**: ```sql SELECT * FROM (SELECT ROWNUM NO, ID, NAME FROM (SELECT * FROM STUDENT ORDER BY NAME)) WHERE NO ; `...

    oracle的rownum用法

    4. 如果表中的主键是按照升序插入的,且查询中没有`GROUP BY`和`ORDER BY`子句,`ROWNUM`的顺序可能与主键的顺序一致。但这是偶然的,不是`ROWNUM`的固有特性。 5. 在子查询中使用`ROWNUM`并将其传递到外部查询中时...

    oracle-rownum用法

    SELECT ROWNUM, id, name FROM student ORDER BY name; ``` 可以看出,ROWNUM 并不是按照 name 列来生成的序号。系统是按照记录插入时的顺序给记录排的号,ROWID 也是顺序分配的。为了解决这个问题,必须使用子查询...

    oracle中rownum的用法

    #### 三、ROWNUM与ORDER BY ##### 1. ROWNUM与排序 需要注意的是,`ROWNUM`的计算顺序依赖于数据检索的顺序。如果您在查询中使用了`ORDER BY`子句,那么`ROWNUM`将按照排序后的结果进行编号。例如: ```sql SELECT ...

    mysql类似oracle rownum写法实例详解

    总的来说,虽然 MySQL 没有内置的 `ROWNUM` 功能,但通过用户定义变量和子查询,我们可以实现与 Oracle 相似的逻辑。理解这些技巧对于那些习惯于 Oracle SQL 而又需要在 MySQL 中工作的开发者来说至关重要。希望这些...

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

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

    Oracle--ROWNUM.rar_oracle

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

    在oracle中灵活使用Rownum和rowId

    SELECT ROWNUM, MONTH, SELL FROM SALE ORDER BY MONTH WHERE ROWNUM ; ``` 这样返回的结果将会按照月份从小到大排序: ```plaintext ROWNUM MONTH SELL ------------------------ 1 200001 1000 2 200002 1100 3 ...

    解决Oracle分页查询中排序与效率问题

    ### 解决Oracle分页查询中排序与效率问题 在Oracle数据库中进行分页查询时,经常会出现性能瓶颈,尤其是在处理大数据量的情况下。本篇文章将详细探讨如何优化Oracle分页查询中的排序与效率问题。 #### 一、理解...

    oracle_SQL中rowid与rownum的使用

    2. **优化查询**:与`ORDER BY`一起使用时,先筛选`ROWNUM`再排序可以提高效率,避免全表排序。 3. **联合查询**:在多个表的连接查询中,通过`ROWNUM`过滤结果可以减少不必要的数据处理。 五、ROWID应用示例 `...

    oracle_SQL-rowid--rownum.zip_oracle

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

Global site tag (gtag.js) - Google Analytics