在 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