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


你可能感兴趣的:(oracle,sql)