sql >> Databasteknik >  >> RDS >> PostgreSQL

kolumnordning i SELECT *-satsen - garanterat?

Låt oss överväga SQL-standarden, avsnitt 7.9 som anges här:

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.

Så, med andra ord, ja, SQL-standarden specificerar att kolumner ska projiceras enligt deras ordningsposition inom T . Observera att saker och ting blir lite knepiga när ditt

består av flera tabeller som involverar JOIN .. USING eller NATURAL JOIN klausuler. Men när du väljer från en enkel tabell går det förmodligen bra om du antar att beställningen är som förväntat.

För fullständighetens skull, betydelsen av en ordningsposition inom T för tabeller förklaras längre ner i 11.4 :

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

Och sedan i 11.11 (för ALTER TABLE uttalanden)

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

Det finns en hel del andra SQL-satser och satser som beror på den formella specifikationen av ordningspositioner inom . Några exempel:

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, i synnerhet, är ganska standardkompatibel, så om du verkligen vill SELECT * , varsågod!




  1. MySQL dynamisk pivottabell

  2. 3 SQL Server-övervakningsfrågor att ställa när man tar över en DBA-position

  3. Hur returnerar du kolumnnamnen för en tabell?

  4. Markör i proceduren returnerar fler värden än fråga