两句话笔记,记住ROWNUM

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值