gpt4 book ai didi

sql - SELECT * 语句中的列顺序 - 保证?

转载 作者:行者123 更新时间:2023-11-29 11:20:44 29 4
gpt4 key购买 nike

我正在使用 ORM (sqlalchemy) 从 PG 数据库中获取数据。我想避免在我手工编写的 SQL 语句中指定所有表列名称*。

到目前为止,我的假设是返回的列按照用于创建数据库表的 DDL 语句的顺序排列。到目前为止,这是可行的 - 但我想知道这是否仅仅是运气,或者它是否在 (ANSI) SQL 规范中有具体说明。

即ANSI SQL(因此可能是数据库)是否保证 SELECT * 语句中返回的列的顺序?

我正在使用 PostgreSQL 8.4 作为我的后端数据库

  • 是的,我知道在 ORM 中使用手工制作的 SQL 语句违背了 ORM 的目的,但必须...

最佳答案

让我们考虑 SQL 标准,第 7.9 <query specification> 节如此处指定:

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

<query specification> ::=
SELECT [ <set quantifier> ] <select list> <table expression>
[...]
<select list> ::=
<asterisk>
| <select sublist> [ { <comma> <select sublist> }... ]

[...]
Syntax Rules
1) Let T be the result of the <table expression>.
3) Case:
a) [...]
b) Otherwise, the <select list> "*" is equivalent to a <value
expression> sequence in which each <value expression> is a
<column reference> that references a column of T and each
column of T is referenced exactly once. The columns are ref-
erenced in the ascending sequence of their ordinal position
within T.

因此,换句话说,是的,SQL 标准指定要根据列在 T 中的顺序位置进行投影。 .请注意,当您的 <table expression> 时,事情会变得有点棘手。由涉及 JOIN .. USING 的几个表组成或 NATURAL JOIN条款。但是,当从一个简单的表格中进行选择时,假设顺序符合预期,您可能没问题。

为了完整起见,ordinal position within T 的含义对于表在 11.4 <column definition> 中进一步解释:

General Rules
5) [...] The ordinal position included
in the column descriptor is equal to the degree of T. [...]

然后在11.11 <add column definition> (对于 ALTER TABLE 语句)

General Rules
4) [...] In particular, the degree of T
is increased by 1 and the ordinal position of that column is
equal to the new degree of T as specified in the General Rules
of Subclause 11.4, "<column definition>".

还有相当多的其他 SQL 语句和子句依赖于 ordinal positions 的正式规范。在 <table expressions> 内.一些例子:

13.8 <insert statement> 
(when omitting the `<insert column list>`)
20.2 <direct select statement: multiple rows>
(when `<sort specification>` contains an `<unsigned integer>`)

特别是 Postgres 非常符合标准,所以如果你真的想要 SELECT * ,继续!

关于sql - SELECT * 语句中的列顺序 - 保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11737232/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com