一、rownum是什么?
1、rownum是对结果集加的一个伪列。(即先查到结果集,再加上rownum)
2、rownum总是从1开始排起的。(好比一般人数数,都是从1开始)
二、rownum怎么用?
--试验用表 CREATE TABLE TABLE_DEMO (ID NUMBER(10),NAME VARCHAR2(10)); --原来是用100条有序记录试验,有误。已删除 <del> DECLARE I INT := 1; BEGIN LOOP INSERT INTO TABLE_EXAMPLE VALUES (I,'USER_' || I); EXIT WHEN I = 100; I := I + 1; END LOOP; END; </del> --10条无序、不重复记录 INSERT INTO TABLE_DEMO VALUES ('10', 'USER_10'); INSERT INTO TABLE_DEMO VALUES ('1', 'USER_1'); INSERT INTO TABLE_DEMO VALUES ('8', 'USER_8'); INSERT INTO TABLE_DEMO VALUES ('4', 'USER_4'); INSERT INTO TABLE_DEMO VALUES ('6', 'USER_6'); INSERT INTO TABLE_DEMO VALUES ('5', 'USER_5'); INSERT INTO TABLE_DEMO VALUES ('3', 'USER_3'); INSERT INTO TABLE_DEMO VALUES ('7', 'USER_7'); INSERT INTO TABLE_DEMO VALUES ('9', 'USER_9'); INSERT INTO TABLE_DEMO VALUES ('2', 'USER_2');
1、查询第n条记录
(1)n=1时
简单地查出第1条。
返回结果:--查出第1条 SELECT * FROM TABLE_DEMO T WHERE ROWNUM = 1;
ID NAME
10 USER_10
按ID递增排序,查出第1条。
①错误做法:
返回结果:--按ID递增排序,查出第1条【错误】 SELECT * FROM TABLE_DEMO T WHERE ROWNUM = 1 ORDER BY T.ID ASC;
ID NAME
10 USER_10
原因:rownum是对结果集加的一个伪列;Oracle是先给记录一个ROWNUM,再进行ORDER BY。当在where子句中使用rownum的时候,限制返回的行数为1,然后对唯一的这一条记录进行排序。
②正确做法:
返回结果:--按ID递增排序,查出第1条【正确】 SELECT * FROM (SELECT * FROM TABLE_DEMO T ORDER BY T.ID ASC) WHERE ROWNUM = 1;
ID NAME
1 USER_1
(2)n>1时
例如:查第2条。
①错误做法
--查出第2条【错误】 SELECT * FROM TABLE_DEMO T WHERE ROWNUM = 2;
返回结果:
(空)
个人理解 :rownum是对结果集加的一个伪列。所以查询时,每取到一条,就会去校验一下条件:又由于,rownum总是从1开始排起的。实际rownum=1 ≠ 2。所以,记录被舍弃。WHERE ROWNUM = 2
以此类推,所有的记录都逐一被舍弃,最终返回空。网上查到的解释:“1”以上的自然数,在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
②正确做法
返回结果:--查出第2条【正确】 SELECT * FROM (SELECT ROWNUM RN, T.* FROM TABLE_DEMO T) WHERE RN = 2
RN ID NAME
2 1 USER_1
2、查询前n条
--请按ID递增排序,查出前5条记录。 SELECT * FROM (SELECT * FROM TABLE_DEMO T ORDER BY T.ID ASC) WHERE ROWNUM <= 5;
返回结果:
ID NAME
1 USER_1
2 USER_2
3 USER_3
4 USER_4
5 USER_5
3、查询后n条
目前只想到先递减排序,取结果集,再递增排序。
返回结果:--请按ID递增排序,查出后5条记录。 SELECT * FROM (SELECT * FROM TABLE_DEMO T ORDER BY T.ID DESC) C1 WHERE ROWNUM <= 5 ORDER BY C1.ID ASC
ID NAME
6 USER_6
7 USER_7
8 USER_8
9 USER_9
10 USER_10
4、查询第m条到第n条
例如,m=3,n=7。
返回结果:--请按ID递增排序,查出第3条至第7条记录。(即第3、4、5、6、7这五条) SELECT * FROM (SELECT ROWNUM RN, C1.* FROM (SELECT T.* FROM TABLE_DEMO T ORDER BY T.ID ASC) C1) WHERE RN >= 3 AND RN <= 7;
RN ID NAME
3 3 USER_3
4 4 USER_4
5 5 USER_5
6 6 USER_6
7 7 USER_7