在 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