sql >> Base de Datos >  >> RDS >> PostgreSQL

orden de las columnas en la declaración SELECT * - ¿garantizado?

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!