开贴讲一下自己的理解
先建一个表
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 不受 ORDER BY 影响,即无论是否使用 ORDER BY 子句,ROWNUM 都是从 1 开始计数的。 - 而在 SQL Server 中,如果需要按特定顺序为行分配行号,则必须使用 ORDER BY 与 ROW_NUMBER() 结合的...
在文中提到的例子中,即使为列添加了索引,`ORDER BY`操作仍然没有按照预期进行,这主要是因为`ROWNUM`不是一个稳定的排序依据,它只是表示查询结果集的顺序,而不是数据本身的物理存储顺序。 `ROWID`是Oracle...
因为 ROWNUM 是在结果集返回之前进行排序的,因此,使用 ROWNUM 对排序结果进行 Top N 取值,可能不会达到预期的结果。 解决方案 为了避免这些问题,我们可以使用子查询和 ROWNUM 结合来实现 Top N 结果输出。例如...
在实际开发中,我们经常需要对查询结果进行排序,MyBatisPlus为此提供了`orderBy`、`orderByDesc`和`orderByAsc`三个方法,方便我们实现条件排序。下面将详细介绍这三个方法的使用及原理。 `orderBy`方法是...
因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值...
- 在使用`ORDER BY`时,如果直接在查询中使用`ROWNUM`,则可能会导致结果集的顺序与预期不符。 - **示例**: ```sql SELECT ROWNUM, ID, NAME FROM STUDENT ORDER BY NAME; ``` 上述查询将根据`NAME`字段对表`...
SELECT * FROM table ORDER BY some_column ) t WHERE ROWNUM ) WHERE rnum > 10; ``` #### 误区2:`BETWEEN`操作符的使用 同样地,`BETWEEN`操作符在`ROWNUM`的使用上也有局限性。例如,`ROWNUM BETWEEN 1 AND...
正确使用ROWNUM可以帮助我们限制返回的结果集大小,进行分页,以及在特定条件下选择行。但同时也需要注意其在不同情况下的行为差异,特别是在与ORDER BY结合使用时的注意事项。在实际应用中,合理利用ROWNUM能显著...
4. 如果表中的主键是按照升序插入的,且查询中没有`GROUP BY`和`ORDER BY`子句,`ROWNUM`的顺序可能与主键的顺序一致。但这是偶然的,不是`ROWNUM`的固有特性。 5. 在子查询中使用`ROWNUM`并将其传递到外部查询中时...
很多人认为 ROWNUM 是在查询结果集整个返回后再分配的顺序编号,但实际上 ROWNUM 是在 Oracle 系统顺序分配的,从查询返回的第一行分配的是 1,第二行是 2,依此类推。这样,ROWNUM 可以用于限制查询返回的总行数。 ...
例如,`SELECT * FROM table1 WHERE ROWNUM < 4 ORDER BY AAA`虽然对结果进行了排序,但`ROWNUM`的值仍然是按照原始数据的顺序生成的,而不是排序后的顺序。因此,如果希望在排序后取前几行,我们需要调整查询策略。...
#### 三、ROWNUM与ORDER BY ##### 1. ROWNUM与排序 需要注意的是,`ROWNUM`的计算顺序依赖于数据检索的顺序。如果您在查询中使用了`ORDER BY`子句,那么`ROWNUM`将按照排序后的结果进行编号。例如: ```sql SELECT ...
注意:对 rownum(伪列) 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据 例:查询工资前20名的员工姓名,工资 ,工资由高到低 Select rownum,first_name,salary from (Select first_name, salary ...
在处理大数据集时,`ROWNUM`通常被用来实现分页功能,即限制返回的结果数量。下面我们将深入探讨`ROWNUM`的使用方式及其特性。 首先,`ROWNUM`为每行分配一个唯一的整数值,从1开始递增。在执行查询时,Oracle会...
#### 二、rownum与查询条件 **1. 等于某值的查询条件** 使用 `rownum = n` (n 为某个正整数) 的方式来限制查询结果时需要注意: - **rownum = 1**: 查询第一行数据是可以的,因为第一行数据的 `rownum` 值恰好为 ...
ORACLE 中ROWNUM用法总结!数据库管理员及程序开发员必看。
SELECT ROWNUM, ID, NAME FROM STUDENT ORDER BY NAME; ``` 可以看出,ROWNUM并不是按照NAME列来生成的序号。系统是按照记录插入时的顺序给记录排的号,ROWID也是顺序分配的。为了解决这个问题,必须使用子查询。 ...
Oracle 的 ROWNUM 伪列是一个非常重要的概念,它对结果集加的一个伪列,即先查到结果集之后再加上去的一个列。了解 ROWNUM 的意义是非常重要的,否则可能会出现莫名其妙的结果。 ROWNUM 的特点是从 1 开始排起的...
2. **优化查询**:与`ORDER BY`一起使用时,先筛选`ROWNUM`再排序可以提高效率,避免全表排序。 3. **联合查询**:在多个表的连接查询中,通过`ROWNUM`过滤结果可以减少不必要的数据处理。 五、ROWID应用示例 `...
本文将讲解 Oracle 中的分页查询,包括使用 ROWNUM 伪列和 ORDER BY 子句对查询结果进行排序和分页。 一、使用 ROWNUM 伪列实现分页查询 在 Oracle 中,ROWNUP 伪列是一个特殊的列,可以用来实现分页查询。例如,...