两句话笔记,记住ROWNUM

来源:互联网 发布:表示认同的网络用语 编辑:程序博客网 时间:2024/05/24 22:45

一、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是对结果集加的一个伪列。所以查询时,每取到一条,就会去校验一下条件:
WHERE ROWNUM = 2
又由于,rownum总是从1开始排起的。实际rownum=1 ≠ 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

0 0
原创粉丝点击