Rumah >pangkalan data >tutorial mysql >Mengapa Klausa `GROUP BY` Berfungsi Berbeza dalam MySQL dan PostgreSQL?

Mengapa Klausa `GROUP BY` Berfungsi Berbeza dalam MySQL dan PostgreSQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-18 09:41:10520semak imbas

Why Does a `GROUP BY` Clause Work Differently in MySQL and PostgreSQL?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn