Oracle 限定返回的结果集 -- ROWNUM

-- Start

首先,我们准备一下测试数据。

CREATE TABLE TEST
(
  NAME VARCHAR2(20),
  BIRTHDAY DATE
);
INSERT INTO TEST VALUES ('张三', DATE '2014-12-14');
INSERT INTO TEST VALUES ('李四', DATE '2013-12-14');
INSERT INTO TEST VALUES ('王五', DATE '2012-12-14');
INSERT INTO TEST VALUES ('赵六', DATE '2011-12-14');


Oracle 在查询数据的时候会为每一行赋一个行号,这个行号会存储在一个叫做 ROWNUM 伪列中,我们可以通过这个伪列来限定返回的结果集。下面的 SQL 返回两条数据。

SELECT * FROM TEST WHERE ROWNUM < 3;

值得注意的是 Oracle 并不是先查询数据,后赋行号,而是查到一条赋一条,为什么这么说呢?下面让我们查询一下年龄最大的两个人是谁?

SELECT * FROM TEST WHERE ROWNUM <= 2 ORDER BY BIRTHDAY;

结果如下:
NAME   BIRTHDAY
李四   14-12月-13
张三   14-12月-14


很明显,这不是我们想要的结果,它是先返回两条数据,后对这两条数据排序。那这个 SQL 应该怎么写呢?答案是子查询。

SELECT * FROM (SELECT * FROM TEST ORDER BY BIRTHDAY) WHERE ROWNUM <= 2;

结果如下:
NAME   BIRTHDAY
赵六	14-12月-11
王五	14-12月-12

到此为止你应该对 ROWNUM 有一定的了解了吧,那么下面这个 SQL 返回什么样的数据呢?我保证答案超乎你的想象。

SELECT * FROM TEST WHERE ROWNUM > 1;

-- 更多参见:Oracle SQL 精萃

-- 声明:转载请注明出处

-- Last Edited on 2015-06-23

-- Created by ShangBo on 2014-12-14

-- End


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值