`

oracle rownum order by 排序

 
阅读更多

注意:rownum=1时取第一条

但rownum=2时是取不到值的!

因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

注意子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。

 

oracle数据库中,如果用到order by,并且有rownum作为条件的时候,需要注意:
rownum是在根据条件取出的结果集范围内,先按照数据库默认的排序先给rownum设定好值后,再根据order by进行排序,所以两者同时存在的时候,select * from *** where rownum <=5 order by name。这个时候取出来的未必就是按照姓名排序的前5条。如果想要得到按照姓名排序的前5条,那么必须用到子查询: select * from (select * from ***  order by name) where rownum< 5。这样就可以得到正确的结果集了。

 

衍生出的rownum知识点

使用rownum分页 取6-10页

  select * from (
       select a1.*, rownum rwn  from emp a1   where rownum <=10
    ) where rwn >= 6;
  或者
  select * from (
    select qx.*,row_number() over(order by qx.empno) rwn from emp qx
  ) where rwn between 6 and 10

 

 

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

 

 

 

分享到:
评论

相关推荐

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

    本文将深入探讨`ORDER BY`子句在Oracle中的排序机制,以及查询时根据`IN`条件顺序输出的方法。 首先,`ORDER BY`用于指定查询结果的排序方式,可以基于一个或多个列进行升序(ASC)或降序(DESC)排序。然而,...

    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也是顺序分配的。为了解决这个问题,必须使用子查询。 ...

    ROWNUM的使用技巧

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

    Oracle rownum.docx

    解决这个问题的方法是将ROWNUM和ORDER BY一起放入子查询,如`SELECT ROWNUM, id, name FROM (SELECT * FROM student ORDER BY name)`,这样ROWNUM将会按照name列的排序生成。 总的来说,理解并掌握Oracle中的ROWNUM...

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

    这是因为 Oracle 在执行 ORDER BY 操作时,会先执行 ORDER BY 语句,然后再进行分页处理。 知识点 3: 解决排序问题的方法 方法一:使用子查询 可以使用子查询来解决排序问题。首先,执行一个子查询来获取所有记录...

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

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

    oracle rownum 使用技术.pdf

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

    oracle排序

    在 Oracle 中,可以使用 ORDER BY 语句对数据进行字符方式排序。例如,以下语句将对 perexl 表中的数据按照 xx 列进行排序: SELECT * FROM perexl ORDER BY perexl.xx; 二、按字符对应的数字方式排序 在 Oracle ...

    oracle-rownum用法

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

    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用法

    这意味着如果没有`ORDER BY`子句,`ROWNUM`的顺序可能是不确定的,因为Oracle数据库可能按照任意顺序读取数据。如果使用`ORDER BY`,`ROWNUM`将根据指定的排序规则进行分配。 在使用`ROWNUM`进行条件过滤时,需要...

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

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

    oracle中rownum的用法

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

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

    例如,`SELECT * FROM table1 WHERE ROWNUM &lt; 4 ORDER BY AAA`虽然对结果进行了排序,但`ROWNUM`的值仍然是按照原始数据的顺序生成的,而不是排序后的顺序。因此,如果希望在排序后取前几行,我们需要调整查询策略。...

    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 ...

    MLDN魔乐科技JAVA培训_Oracle课堂6_排序、单行函数.rar

    在Oracle中,排序是通过SQL的ORDER BY子句实现的,它可以用于查询结果集的排序,使数据按照指定的列和顺序返回。例如,`SELECT * FROM table_name ORDER BY column_name ASC/DESC`,ASC表示升序,DESC表示降序。 ...

Global site tag (gtag.js) - Google Analytics