我对我看到的"朋友"(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;
为了使其正常工作,列需要按指定的顺序排列。 我不认为SELECT
在INSERT . . . SELECT
中的行为与它本身的行为不同(除了行的顺序(。