sql >> Databáze >  >> RDS >> PostgreSQL

pořadí sloupců v příkazu SELECT * - garantováno?

Podívejme se na standard SQL, oddíl 7.9 <query specification> jak je uvedeno zde:

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.

Jinými slovy, ano, standard SQL určuje, že sloupce mají být promítány podle jejich řadové pozice v T . Všimněte si, že věci jsou trochu složitější, když váš <table expression> sestává z několika tabulek obsahujících JOIN .. USING nebo NATURAL JOIN doložky. Při výběru z jednoduché tabulky však pravděpodobně dobře předpokládáte, že pořadí je podle očekávání.

Pro úplnost, význam ordinal position within T pro tabulky je vysvětleno dále v 11.4 <column definition> :

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

A pak v 11.11 <add column definition> (pro ALTER TABLE prohlášení)

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

Existuje několik dalších SQL příkazů a klauzulí, které závisí na formální specifikaci ordinal positions v rámci <table expressions> . Několik příkladů:

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

Zejména Postgres je docela v souladu se standardy, takže pokud opravdu chcete SELECT * , do toho!




  1. Nelze otevřít test databáze požadovaný přihlášením. Přihlášení se nezdařilo. Přihlášení pro uživatele 'xyz\ASPNET' se nezdařilo

  2. Proč parametrizovaný dotaz vytváří mnohem pomalejší plán dotazů ve srovnání s neparametrizovaným dotazem

  3. Kdy bych měl použít proměnnou tabulky vs dočasnou tabulku na serveru SQL?

  4. Může Hibernate fungovat se syntaxí ON DUPLICATE KEY UPDATE MySQL?