MySQL dan PostgreSQL GROUP BY
Klausa: Perbandingan
MySQL dan PostgreSQL, sistem pangkalan data hubungan popular, mengendalikan klausa GROUP BY
secara berbeza. Klausa ini mengumpulkan baris berdasarkan lajur yang ditentukan, membolehkan pengiraan fungsi agregat pada data terkumpul. Mari kita periksa perbezaan utama.
Senario biasa melibatkan jadual (cth., the_table
) dengan lajur col1
, col2
dan col3
. Dalam MySQL, pertanyaan seperti SELECT col2, col3, col1 FROM the_table GROUP BY col2;
mungkin mengembalikan hasil, nampaknya memilih nilai arbitrari untuk col3
dan col1
dalam setiap kumpulan col2
. Walau bagaimanapun, pertanyaan yang sama dalam PostgreSQL menghasilkan ralat.
Mengapa Ralat PostgreSQL?
PostgreSQL mematuhi piawaian SQL dengan ketat. Standard ini memberi mandat bahawa mana-mana lajur dalam senarai SELECT
yang tidak disertakan dalam klausa GROUP BY
mesti menjadi sebahagian daripada fungsi agregat. Dalam contoh kami, col3
dan col1
melanggar peraturan ini.
Fungsi Agregat Diterangkan
Fungsi agregat (seperti MIN
, MAX
, AVG
, SUM
, COUNT
) mengira satu nilai daripada berbilang baris. Ia penting untuk meringkaskan data terkumpul.
Tingkah Laku Bukan Standard MySQL
Tingkah laku MySQL adalah menyimpang daripada standard. Ia membenarkan pemilihan lajur tidak teragregat bukan dalam klausa GROUP BY
, tetapi ini tidak boleh dipercayai. Nilai yang dipilih untuk lajur ini tidak dapat diramalkan dan bergantung pada kerja dalaman pangkalan data; ia tidak dijamin konsisten.
Pertanyaan Mematuhi Standard
Untuk memastikan hasil yang konsisten dan boleh diramal merentas kedua-dua pangkalan data, sentiasa gunakan fungsi agregat untuk lajur yang tidak terdapat dalam klausa GROUP BY
. Pertanyaan berikut berfungsi dengan betul dalam kedua-dua MySQL dan PostgreSQL:
<code class="language-sql">SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1 FROM the_table GROUP BY col2;</code>
Pertanyaan ini menggunakan MIN()
untuk mencari nilai minimum col3
dan col1
bagi setiap kumpulan col2
, memberikan hasil yang jelas. Menggantikan MIN()
dengan fungsi agregat lain seperti MAX()
, AVG()
, dsb., memberikan statistik ringkasan yang berbeza untuk setiap kumpulan. Pendekatan ini menjamin pematuhan SQL standard dan mengelakkan kekaburan yang wujud dalam sambungan GROUP BY
bukan standard MySQL.
Atas ialah kandungan terperinci Mengapa Klausa `GROUP BY` Berfungsi Berbeza dalam MySQL dan PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!