Oracle伪列rownum

Oracle基础知识:伪列rownum,伪列就像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作。

在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返回2,以此类推。通过ROWNUM伪列可以限制查询结果集中返回的行数。

ROWNUM与ROWID不同,ROWID是插入记录时生成,ROWNUM是查询数据时生成。ROWID标识的是行的物理地址。ROWNUM标识的是查询结果中的行的次序。

案例4:查询出员工表中前5名员工的姓名,工作,工资。

代码演示:ROWNUM

SQL> SELECT ROWNUM,ENAME,JOB,SAL FROM EMP WHERE ROWNUM<=5;

 ROWNUM

ENAME

JOB

SAL

1

SMITH

CLERK

800

2

ALLEN

SALESMAN

1600

3

WARD

SALESMAN

1250

4

JONES

MANAGER

2975

5

MARTIN

SALESMAN

1250

 

案例5:查询出工资最高的前5名员工的姓名、工资和工资。

案例分析

“工资最高的前5名”需要先降序排序,再取前5名,但是生成ROWNUM操作比排序要早,排序时已经连同ROWNUM一起排序了,因此不能直接在案例1的语句中直接加上Order by就行,而是需要对排序的结果重新做二次查询,产生新的ROWNUM才能作为查询的条件依据。

代码演示:ROWNUM应用

SQL> SELECT ROWNUM,T.* FROM  ①

  2      (SELECT ENAME,JOB,SAL

  3       FROM EMP ORDER BY SAL DESC) T  ②

  4  WHERE ROWNUM<=5

  5  /

 

ROWNUM

ENAME

JOB

SAL

1

KING

PRESIDENT

5000

2

SCOTT

ANALYST

3000

3

FORD

ANALYST

3000

4

JONES

MANAGER

2975

5

BLAKE

MANAGER

2850

 

代码解析:

① T是子查询②的别名,这里的ROWNUM是第二次查询后的ROWNUM。

案例6:查询出表EMP中第5条到第10条之间的记录。

案例分析

这是分页的应用。在查询条件中,如果查询条件中ROWNUM大于某一正整数,则不返还任何结果。

代码演示:ROWNUM分页

SQL> SELECT * FROM

  2     (SELECT ROWNUM R,ENAME,JOB,SAL  ①

  3      FROM EMP WHERE ROWNUM<=10)  ②

  4  WHERE R>5  ③

  5  /

 R

ENAME

JOB

SAL

6

BLAKE

MANAGER

2850

7

CLARK

MANAGER

2450

8

SCOTT

ANALYST

3000

9

KING

PRESIDENT

5000

10

TURNER

SALESMAN

1500

 

代码解析:

① 内部查询中得到ROWNUM 并且用别名R记录,供外层条件③使用。

② 内部查询的ROWNUM,与外出的ROWNUM列是平等的两列。

③ 使用的R是内层产生的ROWNUM,在外层看来,内层查询的ROWNUM是正常的一列。

来源:Oracle培训

posted on 2016-08-12 11:49  我的oracle学习之路  阅读(7016)  评论(0编辑  收藏  举报

导航