Oracle PL/SQL开发基础(第七弹:ROWNUM伪列)

来源:互联网 发布:linux系统api有哪些 编辑:程序博客网 时间:2024/06/10 01:13

在Oracle中,没有类似于SQL Server中的TOP关键字来获取表中的前几条记录,但是提供了一个更加方便的方法:使用ROWNUM伪列。ROWNUM伪列是Oracle先查到结果集之后再加上去的一个伪列,这个伪列对符合条件的结果添加一个从1开始的序列号。
比如要查询员工表中前10条记录:

SELECT ROWNUM, empno, ename, job, mgr, hiredate  FROM emp WHERE ROWNUM <= 10;

ROWNUM与ROWID最大的不同在于,ROWID是物理存在的,而ROWNUM是动态的,先查到结果集后再加上去的一个列,因此必须有结果集。如果我们写WHERE ROWNUM > 10,当生成结果集时,Oracle首先产生一条ROWNUM为1的记录,显然不匹配ROWNUM > 10这个条件,该条记录被过滤掉后,后生成的记录的ROWNUM依然会是1,因此如果ROWNUM > 10,将不会得到任何结果。所以如果要提取记录中间的记录,必须使用子查询,例如下面的语句将获取第5条到第10条的员工记录:

SELECT recno, empno, ename  FROM (SELECT ROWNUM recno, empno, ename           FROM emp) WHERE recno >= 5 AND recno <= 10;

上面的语句先使用ROWNUM得到具体的记录编号,在外层的查询中过滤具体的记录编号,得到结果集。

知道了ROWNUM的原理以后,我们就可以知道,取前10条记录,除了上面介绍过的写法以外,还能这样写:

SELECT ROWNUM, empno, ename, job, mgr, hiredate  FROM emp WHERE ROWNUM != 11;

取第5到第10条记录,除了上面介绍过的写法以外,还能这样写:

SELECT recno, empno, ename   FROM emp WHERE ROWNUM <= 10MINUSSELECT recno, empno, ename   FROM emp WHERE ROWNUM < 5

对于ROWNUM,只能使用<<=!=,不能使用>>=BETWEEN AND。如果使用>>=BETWEEN AND的话,永远查不到记录。
对于=,只能使用ROWNUM = 1。如果使用ROWNUM = 2的话,永远查不到记录。

还有一点特别重要,那就是ROWNUM和排序一起使用的时候要特别注意。ROWNUM的是在取数据的时候产生的序号,所以想对指定排序的数据去指定ROWNUM的时候要注意。
比如:

SELECT ROWNUM, empno, sal FROM emp ORDER BY sal

上面这样写是得不到想要的结果的。因为ROWNUM并不是按照排序以后的结果来生成序号。系统是按照记录插入时的顺序给记录排的号。为了解决这个问题,必须使用子查询:

SELECT ROWNUM, empno, sal FROM (SELECT empno, sal FROM emp ORDER BY sal);
1 0