sql >> データベース >  >> RDS >> PostgreSQL

SELECT *ステートメントの列の順序-保証されていますか?

    SQL標準のセクション7.9 <query specification>について考えてみましょう。 ここで指定されているように:

    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.
    

    つまり、はい、SQL標準では、列はT内の順序位置に従って投影されるように指定されています。 。 <table expression>の場合、状況が少し複雑になることに注意してください。 JOIN .. USINGを含むいくつかのテーブルで構成されています またはNATURAL JOIN 条項。ただし、単純なテーブルから選択する場合は、順序が期待どおりであると想定して問題ないでしょう。

    完全を期すために、ordinal position within Tの意味 テーブルの場合は、11.4 <column definition>でさらに詳しく説明されています。 :

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

    次に、11.11 <add column definition>で (ALTER TABLEの場合 ステートメント)

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

    ordinal positionsの正式な仕様に依存するSQLステートメントと句は他にもたくさんあります。 <table expressions>内 。いくつかの例:

    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は標準に完全に準拠しているため、本当にSELECT *が必要な場合は 、どうぞ!




    1. ステートメントのINSERTINTO...部分を繰り返さずに、複数の行を挿入しますか?

    2. ORA-00918:SELECTであいまいに定義された列*

    3. コードカバレッジ統計

    4. クラスター間レプリケーションの概要