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