Consideremos el estándar SQL, sección 7.9 <query specification>
como se especifica aquí:
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.
Entonces, en otras palabras, sí, el estándar SQL especifica que las columnas deben proyectarse de acuerdo con su posición ordinal dentro de T
. Tenga en cuenta que las cosas se complican un poco cuando su <table expression>
consta de varias tablas que involucran JOIN .. USING
o NATURAL JOIN
cláusulas. Sin embargo, al seleccionar de una tabla simple, probablemente esté bien suponiendo que el orden es el esperado.
Para completar, el significado de una posición ordinal position within T
para tablas se explica más abajo en 11.4 <column definition>
:
General Rules
5) [...] The ordinal position included
in the column descriptor is equal to the degree of T. [...]
Y luego en 11.11 <add column definition>
(para ALTER TABLE
declaraciones)
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>".
Hay bastantes otras sentencias y cláusulas SQL que dependen de la especificación formal de ordinal positions
dentro de <table expressions>
. Algunos ejemplos:
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, en particular, cumple bastante con los estándares, por lo que si realmente desea SELECT *
, ¡adelante!