Oracle中rowid和rownum简介


问题:Oracle将ROWID和ROWNUM区别开了吗?如果他们有区别,那么他们的区别是什么呢?

回答:正如你的地址唯一的标识了你的住处,一个oracle的rowid唯一的标识了一条数据的物理地址。
rowid提供了你找到这一行数据所需要的所有信息,硬盘号,柱面,块和所在块上的偏移地址。
rownum是一个伪码,一个你可以在SQL*Plus中引用的占位符。rownum可以用于书写专业的sql语句和调整sql。

在sql语句中使用rownum要注意:
正确:where rownum<n;
      where rownum=1;
错误:where rownum>n;
      where rownum=some_num>1
如果你非得这么写的话,这样才正确:
      select * from(
        select rownum rn,t.*  from t
      )
      where rn=3;

例如,为了显示前5条数据,你可以用rownum作为过滤器:
SQL> select rownum,emp.empno,emp.ename,emp.job from emp
  2  where rownum<=5;

    ROWNUM EMPNO ENAME      JOB
---------- ----- ---------- ---------
         1  7369 SMITH      CLERK
         2  7499 ALLEN      SALESMAN
         3  7521 WARD       SALESMAN
         4  7566 JONES      MANAGER
         5  7654 MARTIN     SALESMAN

总之,rowid和rownum的区别是rownum是暂时的而rowid是永久的。
另外,rowid可以用来获取一个数据行,rowid仅仅在单个sql语句内容里面有意义,一种参照取出的数据集的方式。

SQL> select rownum,rowid,empno,initcap(ename),initcap(job),sal from emp;

    ROWNUM ROWID              EMPNO INITCAP(ENAME) INITCAP(JOB)       SAL
---------- ------------------ ----- -------------- ------------ ---------
         1 AAAL+ZAAEAAAAAdAAA  7369 Smith          Clerk           800.00
         2 AAAL+ZAAEAAAAAdAAB  7499 Allen          Salesman       1600.00
         3 AAAL+ZAAEAAAAAdAAC  7521 Ward           Salesman       1250.00
         4 AAAL+ZAAEAAAAAdAAD  7566 Jones          Manager        2975.00
         5 AAAL+ZAAEAAAAAdAAE  7654 Martin         Salesman       1250.00
         6 AAAL+ZAAEAAAAAdAAF  7698 Blake          Manager        2850.00
         7 AAAL+ZAAEAAAAAdAAG  7782 Clark          Manager        2450.00
         8 AAAL+ZAAEAAAAAdAAH  7788 Scott          Analyst        3000.00
         9 AAAL+ZAAEAAAAAdAAI  7839 King           President      5000.00
        10 AAAL+ZAAEAAAAAdAAJ  7844 Turner         Salesman       1500.00
        11 AAAL+ZAAEAAAAAdAAK  7876 Adams          Clerk          1100.00
        12 AAAL+ZAAEAAAAAdAAL  7900 James          Clerk           950.00
        13 AAAL+ZAAEAAAAAdAAM  7902 Ford           Analyst        3000.00
        14 AAAL+ZAAEAAAAAdAAN  7934 Miller         Clerk          1300.00

相关内容