PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

urutan kolom dalam pernyataan SELECT * - dijamin?

Mari kita pertimbangkan standar SQL, bagian 7.9 <query specification> seperti yang ditentukan di sini:

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.

Jadi, dengan kata lain, ya, standar SQL menetapkan bahwa kolom diproyeksikan sesuai dengan posisi ordinalnya dalam T . Perhatikan, bahwa segala sesuatunya menjadi sedikit rumit, ketika <table expression> . Anda terdiri dari beberapa tabel yang melibatkan JOIN .. USING atau NATURAL JOIN klausa. Namun, saat memilih dari tabel sederhana, Anda mungkin baik-baik saja dengan asumsi bahwa urutannya seperti yang diharapkan.

Untuk kelengkapan, arti dari ordinal position within T untuk tabel dijelaskan lebih lanjut di 11.4 <column definition> :

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

Dan kemudian di 11.11 <add column definition> (untuk ALTER TABLE pernyataan)

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

Ada beberapa pernyataan dan klausa SQL lain yang bergantung pada spesifikasi formal ordinal positions dalam <table expressions> . Beberapa contoh:

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, khususnya, cukup sesuai standar, jadi jika Anda benar-benar ingin SELECT * , silakan!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ambil nilai terakhir yang diketahui untuk setiap kolom dari satu baris

  2. subquery di FROM harus memiliki alias

  3. Kumpulkan Kunci JSON Rekursif Di Postgres

  4. Kurangi Bulan dari Tanggal di PostgreSQL

  5. Menggunakan PgBouncer Connection Pooler untuk PostgreSQL dengan ClusterControl 1.8.2