日期:2014-05-16  浏览次数:20327 次

Oracle 中的 ROWID 和 ROWNUM

在 Oracle 的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改查操作。oracle 中的 ROWID 和 ROWNUM 就是其中的伪列:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
Connected as scott

?

一、ROWID:表中没列数据的物理地址。通过 ROWID 查询表的效率是最高的。

SQL> select t.ename,rowid from emp t;
 
ENAME      ROWID
---------- ------------------
SMITH      AAAR3sAAEAAAACXAAA
ALLEN      AAAR3sAAEAAAACXAAB
WARD       AAAR3sAAEAAAACXAAC
JONES      AAAR3sAAEAAAACXAAD
MARTIN     AAAR3sAAEAAAACXAAE
BLAKE      AAAR3sAAEAAAACXAAF
CLARK      AAAR3sAAEAAAACXAAG
SCOTT      AAAR3sAAEAAAACXAAH
KING       AAAR3sAAEAAAACXAAI
TURNER     AAAR3sAAEAAAACXAAJ
ADAMS      AAAR3sAAEAAAACXAAK
JAMES      AAAR3sAAEAAAACXAAL
FORD       AAAR3sAAEAAAACXAAM
MILLER     AAAR3sAAEAAAACXAAN
 
14 rows selected

SQL> select t.ename,rowid from emp t where t.rowid = 'AAAR3sAAEAAAACXAAA';
 
ENAME      ROWID
---------- ------------------
SMITH      AAAR3sAAEAAAACXAAA

?oracle 中的各种索引则是通过不同的渠道获得 ROWID 从而达到高效率查询。

?

二、ROWNUM:表示结果集中每一行的行号,第一行为1,每行行号增加1,且 WHERE 条件中 ROWNUM 不能大于。

SQL> select ename,rownum from emp;
 
ENAME          ROWNUM
---------- ----------
SMITH               1
ALLEN               2
WARD                3
JONES               4
MARTIN              5
BLAKE               6
CLARK               7
SCOTT               8
KING                9
TURNER             10
ADAMS              11
JAMES              12
FORD               13
MILLER             14
 
14 rows selected


--利用 ROWNUM 实现分页功能。(每页显示5条数据,显示第二页)
SQL> select * from (select * from (select ename,rownum r from emp) t where r <= (2*5)) t2 where r > ((2-1)*5);
 
ENAME               R
---------- ----------
BLAKE               6
CLARK               7
SCOTT               8
KING                9
TURNER             10