PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

ordine delle colonne nell'istruzione SELECT * - garantito?

Consideriamo lo standard SQL, sezione 7.9 <query specification> come specificato qui:

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.

Quindi, in altre parole, sì, lo standard SQL specifica che le colonne devono essere proiettate in base alla loro posizione ordinale all'interno di T . Nota che le cose si complicano quando il tuo <table expression> è costituito da diverse tabelle che coinvolgono JOIN .. USING o NATURAL JOIN clausole. Tuttavia, quando selezioni da una semplice tabella, probabilmente stai bene supponendo che l'ordine sia come previsto.

Per completezza, il significato di una ordinal position within T per le tabelle è spiegato più in basso in 11.4 <column definition> :

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

E poi in 11.11 <add column definition> (per ALTER TABLE dichiarazioni)

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>".

Ci sono parecchie altre istruzioni e clausole SQL che dipendono dalla specifica formale di ordinal positions all'interno di <table expressions> . Alcuni esempi:

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, in particolare, è abbastanza conforme agli standard, quindi se vuoi davvero SELECT * , vai avanti!