具有ROWNUM和PRIMARY KEY列的查询返回的行

时间:2017-05-01 09:57:51

标签: sql oracle

我正在阅读大约一个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 (主键列),则广告订单无效。为什么这个行为只有主键列?

2 个答案:

答案 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 ..