`
mmclxq
  • 浏览: 6796 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

(转) ROWNUM与ORDER BY联用时对结果集的影响

阅读更多

开贴讲一下自己的理解

先建一个表
     CREATE TABLE TEST(ID NUMBER PRIMARY KEY NOT NULL, NAME VARCHAR2(15));
        /
        INSERT INTO TEST VALUES(1, 'John');
        INSERT INTO TEST VALUES(4, 'Tim');
        INSERT INTO TEST VALUES(2, 'Julie');
        INSERT INTO TEST VALUES(3, 'Stacy');
        INSERT INTO TEST VALUES(6, 'Rahul');
        INSERT INTO TEST VALUES(8, 'Leena');
        INSERT INTO TEST VALUES(7, 'Amy');
        INSERT INTO TEST VALUES(11, 'Bill');
        INSERT INTO TEST VALUES(9, 'Teri');
        INSERT INTO TEST VALUES(5, 'Julie');
        /

注意ID为2和ID为5的NAME是一样的, 有意为之

1, 当ROWNUM单独使用时, 它是按照数据的物理存储位置来赋予NUM号的,
    根据ROWID, 我们可以加以验证, 如下SQL:
        SQL> SELECT ID, NAME, ROWID FROM   TEST WHERE  ROWNUM < 6 ;

                ID NAME            ROWID
        ---------- --------------- ------------------
                 1 John              AAADm2AABAAAGJiAAA
                 4 Tim                AAADm2AABAAAGJiAAB
                 2 Julie               AAADm2AABAAAGJiAAC
                 3 Stacy             AAADm2AABAAAGJiAAD
                 6 Rahul             AAADm2AABAAAGJiAAE

    注意ROWID的顺序

2, 当ROWNUM与ORDER BY联合使用时, 分两种情况:
    a,) 当ROWNUM与ORDER BY处于同一查询语句时, Oracle 是先给记录一个ROWNUM再进行ORDER BY,
         如下情况:
         SQL> SELECT ID, NAME, ROWID FROM   TEST WHERE  ROWNUM < 6  ORDER BY NAME;

                 ID NAME            ROWID
         ---------- --------------- ------------------
                  1 John              AAADm2AABAAAGJiAAA
                  2 Julie              AAADm2AABAAAGJiAAC
                  6 Rahul            AAADm2AABAAAGJiAAE
                  3 Stacy            AAADm2AABAAAGJiAAD
                  4 Tim               AAADm2AABAAAGJiAAB

       注意ROWID, 先取前面5笔记录 AAADm2AABAAAGJiAAA 至 AAADm2AABAAAGJiAAE
       再ORDER BY



    b,) 当ROWNUM与ORDER BY不处于同一查询语句,ORDER BY在子查询而ROWNUM在外层时,
         Oracle是先对记录一个ROWNUM再进行ORDER BY再给记录赋予一个ROWNUM.
         如下情况:   
         SQL> SELECT *
           2  FROM (SELECT ID, NAME, ROWID FROM   TEST ORDER BY NAME)
           3  WHERE  ROWNUM < 6;
         
                 ID NAME            ROWID
         ---------- --------------- ------------------
                  7 Amy               AAADm2AABAAAGJiAAG
                 11 Bill                AAADm2AABAAAGJiAAH
                  1 John              AAADm2AABAAAGJiAAA
                  2 Julie              AAADm2AABAAAGJiAAC
                  5 Julie              AAADm2AABAAAGJiAAJ
   
           这个,...呃, 咋说呢, 一目了然

3, 当ROWNUM与ORDER BY处于同一查询语句时, 根据ORDER BY的字段是否为PRKMARY KEY, 又分两种情况.

    先删除TEST中的记录, 再INSERT如下记录
     INSERT INTO TEST VALUES(99, 'John');
        INSERT INTO TEST VALUES(1, 'John');
        INSERT INTO TEST VALUES(4, 'Tim');
        INSERT INTO TEST VALUES(2, 'Julie');
        INSERT INTO TEST VALUES(3, 'Stacy');
        INSERT INTO TEST VALUES(6, 'Rahul');
        INSERT INTO TEST VALUES(8, 'Leena');
        INSERT INTO TEST VALUES(7, 'Amy');
        INSERT INTO TEST VALUES(11, 'Bill');
        INSERT INTO TEST VALUES(9, 'Teri');
        INSERT INTO TEST VALUES(5, 'Julie');

        留意上面蓝色部分
    a,) 当ORDER BY字段为PRIMARY KEY时, 此时Oracle是先ORDER BY再对记录ROWNUM
           如下SQL:
           SQL> SELECT ID, NAME, ROWID FROM   TEST WHERE  ROWNUM < 6  ORDER BY ID;

                   ID NAME            ROWID
           ---------- --------------- ------------------
                    1 John              AAADm5AABAAAGJiAAB
                    2 Julie              AAADm5AABAAAGJiAAD
                    3 Stacy            AAADm5AABAAAGJiAAE
                    4 Tim               AAADm5AABAAAGJiAAC
                    5 Julie             AAADm5AABAAAGJiAAK

            再看看ID为99的记录的ROWID
            SQL> SELECT ID, NAME, ROWID FROM   TEST;

                    ID NAME            ROWID
            ---------- --------------- ------------------
                    99 John             AAADm5AABAAAGJiAAA
                     1 John              AAADm5AABAAAGJiAAB
                     4 Tim                AAADm5AABAAAGJiAAC
                     2 Julie               AAADm5AABAAAGJiAAD
                     3 Stacy             AAADm5AABAAAGJiAAE
                     6 Rahul             AAADm5AABAAAGJiAAF
                     8 Leena            AAADm5AABAAAGJiAAG
                     7 Amy               AAADm5AABAAAGJiAAH
                    11 Bill                AAADm5AABAAAGJiAAI
                     9 Teri                AAADm5AABAAAGJiAAJ
                     5 Julie               AAADm5AABAAAGJiAAK

          注意粉红色部分, 应该可以看出ID为99的记录最先INSERT, 其ROWID最小,
          但由于其ID最大, 且ID为PRIMARY KEY, 因此在
       SELECT ID, NAME, ROWID FROM   TEST WHERE  ROWNUM < 6  ORDER BY ID
           先对ID做了ORDER BY操作, 再对操作后的结果集赋ROWNUM,
           然后取出符合条件(ROWNUM < 6)的值


    b,) 当ORDER BY字段不为PRIMARY KEY时, 参照我写的第 1 种情况

 

转自http://www.itpub.net/thread-961972-1-1.html

分享到:
评论

相关推荐

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

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

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

    在文中提到的例子中,即使为列添加了索引,`ORDER BY`操作仍然没有按照预期进行,这主要是因为`ROWNUM`不是一个稳定的排序依据,它只是表示查询结果集的顺序,而不是数据本身的物理存储顺序。 `ROWID`是Oracle...

    ROWNUM的使用技巧

    因为 ROWNUM 是在结果集返回之前进行排序的,因此,使用 ROWNUM 对排序结果进行 Top N 取值,可能不会达到预期的结果。 解决方案 为了避免这些问题,我们可以使用子查询和 ROWNUM 结合来实现 Top N 结果输出。例如...

    MyBatisPlus条件构造器带条件排序方法orderBy、orderByDesc、orderByAsc使用示例代码

    在实际开发中,我们经常需要对查询结果进行排序,MyBatisPlus为此提供了`orderBy`、`orderByDesc`和`orderByAsc`三个方法,方便我们实现条件排序。下面将详细介绍这三个方法的使用及原理。 `orderBy`方法是...

    对于 Oracle 的 rownum 问题

    因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值...

    oracle中rownum的用法及解说

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

    ORACLE 中ROWNUM用法总结

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

    Oracle rownum.docx

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

    oracle的rownum用法

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

    oracle rownum和distinct

    很多人认为 ROWNUM 是在查询结果集整个返回后再分配的顺序编号,但实际上 ROWNUM 是在 Oracle 系统顺序分配的,从查询返回的第一行分配的是 1,第二行是 2,依此类推。这样,ROWNUM 可以用于限制查询返回的总行数。 ...

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

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

    oracle中rownum的用法

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

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

    注意:对 rownum(伪列) 只能使用 &lt; 或 &lt;=, 而用 =, &gt;, &gt;= 都将不能返回任何数据  例:查询工资前20名的员工姓名,工资 ,工资由高到低 Select rownum,first_name,salary from (Select first_name, salary ...

    解析rownum

    在处理大数据集时,`ROWNUM`通常被用来实现分页功能,即限制返回的结果数量。下面我们将深入探讨`ROWNUM`的使用方式及其特性。 首先,`ROWNUM`为每行分配一个唯一的整数值,从1开始递增。在执行查询时,Oracle会...

    rownum用法(不使用minus)

    #### 二、rownum与查询条件 **1. 等于某值的查询条件** 使用 `rownum = n` (n 为某个正整数) 的方式来限制查询结果时需要注意: - **rownum = 1**: 查询第一行数据是可以的,因为第一行数据的 `rownum` 值恰好为 ...

    rowid与rownum区别

    ORACLE 中ROWNUM用法总结!数据库管理员及程序开发员必看。

    oracle rownum 学习

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

    关于oracle的rownum

    Oracle 的 ROWNUM 伪列是一个非常重要的概念,它对结果集加的一个伪列,即先查到结果集之后再加上去的一个列。了解 ROWNUM 的意义是非常重要的,否则可能会出现莫名其妙的结果。 ROWNUM 的特点是从 1 开始排起的...

    oracle_SQL中rowid与rownum的使用

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

    oracle的分页查询

    本文将讲解 Oracle 中的分页查询,包括使用 ROWNUM 伪列和 ORDER BY 子句对查询结果进行排序和分页。 一、使用 ROWNUM 伪列实现分页查询 在 Oracle 中,ROWNUP 伪列是一个特殊的列,可以用来实现分页查询。例如,...

Global site tag (gtag.js) - Google Analytics