我正在阅读大约一个oracle伪列,即 ROWNUM :返回数字,表示oracle返回行的顺序。
我在这里遇到过一些行为,
使用的示例 1.创建脚本:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
2插入脚本:
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Max', 22, 'India', 4500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Maths', 22, 'US', 4500.00 );
从CUSTOMERS中选择*;以与上面插入的顺序相同的顺序执行,
ID NAME AGE ADDRESS SALARY
------ ---- --- ------- ------
2 Max 22 India 4500.00
1 Math 22 US 4500.00
如果我运行select查询,
select
rownum,
customers.ID
from customers;
我得到以下输出:
ROWNUW ID
------ --
1 1
2 2
此处 ID = 2 插入第一个,但oracle在第二行中返回
但是,如果你包含ROWNUM和PK的表中的任何其他列,如
select
rownum,
customers.ID,customers.Name
from customers;
我得到正确的输出(正确的插入顺序):
ROWNUW ID NAME
------ -- ----
1 2 Max
2 1 Math
如果运行没有名称列的查询,即仅 ROWNUW (伪列)和 PK (表格列)
我们得到了这个,
ROWNUW ID
------ --
1 1
2 2
我的问题是为什么 ID = 2 不是第一次返回的行。
如果我使用 ROWNUM 查询任何表列,我会根据广告订单返回结果。
以下示例
select
rownum,
(NAME / AGE / ADDRESS SALARY) any one of these columns
From CUSTOMERS
但是如果使用 ROWNUM 并使用 ID (主键列),则广告订单无效。为什么这个行为只有主键列?
答案 0 :(得分:1)
ROWNUM值取决于oracle如何访问结果集。获取结果集后,会为行分配rownum
。
由于无法保证数据的返回顺序,因此无法保证分配rownum
的顺序。
也许如果您尝试在没有rownum的情况下运行两个查询,您可能会在显示时交换行,或者可能不会。
答案 1 :(得分:0)
无论你在结果集中得到什么,Rownum总是按1,2,3,4的顺序排列。始终在从查询返回结果集后计算。
现在,您将ID列作为PRIMARY KEY,这使其有资格在数据库中创建默认聚簇索引。因此,当您仅选择PRIMARY列时,它将按照以这种方式存储在DB中进行排序。作为PRIMARY密钥创建的结果创建的索引在ASC中排序,这是默认的。
如果您只选择PRIMARY KEY列,即“ID”,则数据库按排序顺序返回,ROWNUM正在写入1& 2到它。
但是,如果您正在选择一些额外的非PRIMARY KEY,那么它完全取决于oracle,无论哪种方式更快地找到数据。有时它会从缓存中返回数据。如果不是,它将读取磁盘并获取数据。在读取数据文件时,机器与机器有多种不同之处,即您的表分区了吗?你的表共享表空间?你在桌上使用什么组织?等等等等。
底线是,不要信任ROWNUM。在将大脑应用于查询后,它会给出1,2,3 ..