开贴讲一下自己的理解
先建一个表
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
分享到:
相关推荐
因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值...
ORACLE 中ROWNUM用法总结!数据库管理员及程序开发员必看。
注意:对 rownum(伪列) 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据 例:查询工资前20名的员工姓名,工资 ,工资由高到低 Select rownum,first_name,salary from (Select first_name, salary ...
oracle 分页查询 使用ROWNUM技巧及陷阱
oracle rownum和distinct
sql语句中select top n与oracle的rownum与mysql的limit 取前几条数据sql简单用法
ORACLE 中ROWNUM用法总结 整理版本,详细明了
Oracle中rownum的使用
仅仅使用select语句就可以完成分页,学习一下rownum 会有用处的
oracle 数据库 rowid与rownum的使用
关于oracle的rownum关于oracle的rownum关于oracle的rownum关于oracle的rownum关于oracle的rownum
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而row_number()在包含排序从句后是先排序再计算行号码。 一、oracle中rownum 用于从查询返回的行的编号,返回的第一行...
oracle rownum
内涵oracle rownum的详细讲解。
Oracle与SQL Server应用差异对比分析在Oracle中采用伪列rownum 获取结果集中排在前面的部分记录 Eg: 返回结果集中前10条记录 Select * from sysc01 where rownum Rownum可使用<、符号,不可使用>、>=符号,如果使用...
oracle_SQL中rowid与rownum的使用
目前,很多人想通过ROWNUM取得第N条数据,可以没有办法实现。现在本人有这么一条语句,供大家学习学习。通过ROWNUM取得第二条数据
oracle_SQL中ROWID与ROWNUM的使用 很有用哦
Oracle配置par参数文件做备份,可以对tables=(表1,表2...),query='where rownum做导出行数控制,#exp parfile=jpf.par
1.或许有的人会用id+limit来实现上一条,下一条功能.但是.我们试想一下.有的业务并不是用id来排序的.那这样的方法就没效果了. 2.现在找到了生成rownum的方法,并且优化了执行...3.直接上我项目里的sql,希望对大家有用.