Rowid和Rownum对于数据库开发人员来说基本很少用到,因为在企业数据库开发中大多都是进行数据批处理,但是对于其他数据库人员来说还是会用到的。
rowid和rownum都是虚列,但含义完全不同。rowid是物理地址,用于定位oracle中具体数据的物理存储位置,而rownum则是sql的输出结果排序。通俗的讲:rowid是相对不变的,rownum会变化,尤其是使用order by的时候。
rowid 用于定位数据表中某条数据的位置,是唯一的、也不会改变
rownum 表示查询某条记录在整个结果集中的位置, 同一条记录查询条件不同对应的 rownum 是不同的而 rowid 是不会变的
例如有如下一张表 :USER
name | age |
张三 | 20 |
李四 | 22 |
王五 | 23 |
当执行查询 : select rowid ,rownum ,name,age from USER order by age asc 时结果如下:
rowid | rownum | name | age |
AAAOWhAAQAAALgdAAa | 1 | 张三 | 20 |
AAAOWhAATAAALp7AAd | 2 | 李四 | 22 |
AAAOWhAATAAALp7AAe | 3 | 王五 | 23 |
当执行查询 : select rowid ,rownum ,name,age from USER order by age desc 时结果如下:
rowid | rownum | name | age |
AAAOWhAATAAALp7AAe | 1 | 王五 | 23 |
AAAOWhAATAAALp7AAd | 2 | 李四 | 22 |
AAAOWhAAQAAALgdAAa | 3 | 张三 | 21 |
ROWID:
1、为什么使用ROWID
ORACLE把ROWID作为B-树和其内部算法标示ROW的唯一标示。在ORACLE8以前的版本中,ROWID标示FILE、BLOCK,ROW NUMBER,只用一个数字代表FILE号。
在ORACLE8中,一个DATAFILE有两个数字代表:
1.)一个绝对值,是整个数据库唯一的。可以看DBA_DATA_FILES中的FILE_ID。
2.)一个相对值,在TABLESPACE中是唯一的,可以看DBA_DATA_FILES中的RELATIVE_FNO。
- SQL> SELECT RELATIVE_FNO FROM DBA_DATA_FILES;
- RELATIVE_FNO
- ------------
- 4
- 3
- 2
- 1