ROWNUM是一个伪列,它根据从查询中检索行的顺序为每行分配一个递增式的唯一整数值。因此,检索到的第一行的ROWNUM为1,第二行的ROWNUM为2,依此类推。
此功能可用于限制查询所检索的行数。这在以下示例中进行了演示:
SELECT empno, ename, job FROM emp WHERE ROWNUM < 5;
empno | ename | job
-------+-------+----------
7369 | SMITH | CLERK
7499 | ALLEN | SALESMAN
7521 | WARD | SALESMAN
7566 | JONES | MANAGER
(4 rows)
ROWNUM 值在对结果集进行任何排序之前分配给每一行。因此,结果集按 ORDER BY 子句给出的顺序返回,但 ROWNUM 值不一定按升序顺序返回,如以下示例所示:
SELECT ROWNUM, empno, ename, job FROM emp WHERE ROWNUM < 5 ORDER BY ename;
rownum | empno | ename | job
--------+-------+-------+----------
2 | 7499 | ALLEN | SALESMAN
4 | 7566 | JONES | MANAGER
1 | 7369 | SMITH | CLERK
3 | 7521 | WARD | SALESMAN
(4 rows)
以下示例显示如何将序列号添加到 jobhist 表中的每一行。首先,将一个名为 seqno 的新列添加到表中,然后在 UPDATE 命令中将 seqno 设置为 ROWNUM。
ALTER TABLE jobhist ADD seqno NUMBER(3);
UPDATE jobhist SET seqno = ROWNUM;
以下 SELECT 命令显示了新的 seqno 值。
SELECT seqno, empno, TO_CHAR(startdate,'DD-MON-YY') AS start, job FROM jobhist;
seqno | empno | start | job
-------+-------+-----------+-----------
1 | 7369 | 17-DEC-80 | CLERK
2 | 7499 | 20-FEB-81 | SALESMAN
3 | 7521 | 22-FEB-81 | SALESMAN
4 | 7566 | 02-APR-81 | MANAGER
5 | 7654 | 28-SEP-81 | SALESMAN
6 | 7698 | 01-MAY-81 | MANAGER
7 | 7782 | 09-JUN-81 | MANAGER
8 | 7788 | 19-APR-87 | CLERK
9 | 7788 | 13-APR-88 | CLERK
10 | 7788 | 05-MAY-90 | ANALYST
11 | 7839 | 17-NOV-81 | PRESIDENT
12 | 7844 | 08-SEP-81 | SALESMAN
13 | 7876 | 23-MAY-87 | CLERK
14 | 7900 | 03-DEC-81 | CLERK
15 | 7900 | 15-JAN-83 | CLERK
16 | 7902 | 03-DEC-81 | ANALYST
17 | 7934 | 23-JAN-82 | CLERK
(17 rows)