我们先来讲一下Oracle查询语句中rownum
和rowid
的基本概念:
rownum
:是Oracle中的一个伪列(pseudo column),用于筛选返回的结果集的行数,就是记录的行号。该值是在执行查询的时候动态生成的,因此对于同样的查询,每次执行时都会产生不同的rownum
值。举个例子,rownum
值为1的行就是匹配查询条件的第一行,rownum
值为2的行就是匹配查询条件的第二行,以此类推。rowid
:是Oracle中记录的物理位置标识符,它是在记录插入到表中时自动赋值的。每个记录都有唯一的rowid
,即使在不同的表中也是如此,rowid
是一个十六进制的字符串,长度为18个字符。
下面我们来分析一下rownum
和rowid
之间的差异:
- 作用不同
rownum
主要用于限制查询结果的行数,rowid
则是对记录的物理位置进行标识。
- 生成方式不同
rownum
是在查询时临时生成的,每次查询结果的顺序可能发生变化,即使使用了order by
语句,也不会改变rownum
的值,因此,我们不能在查询时指定某个特定的rownum
值。而rowid
是在插入记录时自动生成,是不可修改的,可以用来精确地定位一条记录,因此我们可以根据rowid
查找某一条指定的记录。
- 用法不同
rownum
一般是配合order by
语句使用,以限制返回结果的行数,比如我们只需要查询前10条结果:
SELECT *
FROM table_name
WHERE condition
ORDER BY column_name
FETCH FIRST 10 ROWS ONLY;
而rowid
一般用于数据快速定位,当我们已经知道某条记录的rowid
时,可以直接用rowid
条件查询,效率比较高:
SELECT *
FROM table_name
WHERE rowid = 'AAARf4AABAAA7mvAAA';
所以,这两个特殊列的应用场景不同,有各自独特的用途。
附:示例说明
首先,我们构造一个测试数据表,包含id和name两列:
CREATE TABLE test_data (
id INTEGER,
name VARCHAR(10)
);
INSERT INTO test_data(id, name)
VALUES (1, 'John');
INSERT INTO test_data(id, name)
VALUES (2, 'Tom');
INSERT INTO test_data(id, name)
VALUES (3, 'Jerry');
INSERT INTO test_data(id, name)
VALUES (4, 'Lucy');
接下来,我们对这个表进行查询,看看rownum
和rowid
的区别:
查询结果中前3行数据的rownum
值:
SELECT id, name, rownum
FROM test_data
WHERE rownum <= 3
ORDER BY id;
查询结果中每行的rowid
值:
SELECT id, name, rowid
FROM test_data;
我们可以看到,列“rownum”的值是动态生成的,根据条件的变化而变化,随时可能发生改变;而列“rowid”是固定的、与记录所在位置有关的值,可以在不同的查询中使用以定位相应的记录。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle查询语句中rownum与rowid的不同之处分析 - Python技术站