一.ROWID 介绍
ORACLE 中 ROWID 用于定位数据库中记录的一个相对唯一地址值。通常情况下,在该行数据插入到数据库表时就被确定且唯一。ROWID 并不实际存在于表中。简单来说 rowid 就是用于定位数据表中某条数据的唯一位置、也不会改变
rowid值主要包括下面信息:
数据对象编号,数据文件编号,数据块编号,数据块中行编号
通常情况下,同一表中所有字段都一样的多行记录使用where 删除数据是会误删所有条件匹配的数据
我们可以根据同一表中 rowid 唯一的规则,可以用来删除表中的重复数据:
删除一条重复数据
-- 查看表中的rowid
select rowid,tmp .* from 表名 tmp ;
-- 可根据查到的rowid 删除数据
DELETE from 表名 WHERE in ('xxx');
删除表中所有重复数据
DELETE FROM 需要去重的表 t1
WHERE rowid NOT IN (
SELECT max(rowid)
FROM 需要去重的表 t2
WHERE t1.id = t2.id )
根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。
B-Tree索引
B-Tree索引的每个索引条目具有两个字段。第一个字段表示索引的键值,对于单列索引来说是一个值;而对于多列索引来说则是多个值组合在一起的。第二个字段表示键值所对应的记录行的ROWID。
索引查询逻辑 索引值→ROWID->将ROWID换算成物理地址->定位到具体数据
二.rownum 介绍
rownum 表示查询某条记录在结果集中的位置,同一条记录查询条件不同对应的 rownum 是不同的
当 WHERE ROWNUM = 2 会查不到任何数据 ,因为 ROWNUM 始终是为查询结果编号,并且始终以 1 开始;同理 WHERE ROWNUM > 1 也查不到任何数据;WHERE ROWNUM = 1 能够取到数据
类似以下动作:
表数据 | 动作 | ROWNUM | 条件 | ||
数据1 | 取一条数据 | 1 | WHERE ROWNUM = 2 | 不匹配 | 取下一条 |
数据2 | 取一条数据 | 1 | 不匹配 | 取下一条 | |
…… | …… | …… | …… | …… |
对于有排序的分页,分段取数据的操作,只能用子查询来实现先排序,后rownum 取别名的方法实现
SELECT * FROM(
SELECT rownum r , a FROM 需要查询的表 WHERE rownum <= 20 ORDER BY name )
WHERE r > 10 ;