"*"是否确保特定的列排序?



我对我看到的"朋友"(LOL(写的查询感到好奇,我对此感到惊讶。以下是简化的情况:

create table my_table (
a int,
b int,
c int,
d int,
primary key (a, b, c)
);
insert into my_table (a, b, c, d) values (1, 2, 3, 4);
insert into my_table (a, b, c, d) values (5, 6, 7, 8);
select *, count(*), sum(d)
from my_table
group by 1, 2, 3

这实际上适用于PostgreSQL,并在最后一行1, 2, 3转换为a, b, c,而不是转换为c, b, a或其他。

结果(PostgreSQL 11.1(:

a  b  c  d  count  sum
-  -  -  -  -----  ---
5  6  7  8      1    8
1  2  3  4      1    4

那么,*实际上是否保留列顺序?

我可能不会写这样令人困惑的查询,但仍然想知道SQL标准是否对此有所说明。

我将忽略您的示例代码并解决问题:

*实际上是否保留列顺序?

一般来说,我没有找到保证保留列顺序的具体文档或参考。 如果有人在标准中甚至特定数据库中提供这样的参考,我将非常高兴。

但是,我认为可以安全地假设顺序被保留。 以下是三个原因。

首先,我所经历的所有数据库都始终保留顺序。 更重要的是,对于多个表,排序是按照FROM子句中指定的顺序进行的。

其次,排序是已知的——至少在提供元数据模式的数据库中是这样。 列INFORMATION_SCHEMA.COLUMNS.ORDINAL_NUMBER包含此信息。

最后,以下内容有效,我认为可以保证在任何数据库中工作:

insert into t
select *
from t;

为了使其正常工作,列需要按指定的顺序排列。 我不认为SELECTINSERT . . . SELECT中的行为与它本身的行为不同(除了行的顺序(。

最新更新