Klausa GROUP BY
MySQL: Keputusan Tidak Dijangka Tanpa Fungsi Agregat
Klausa GROUP BY
dalam SQL adalah penting untuk pengagregatan data. Walau bagaimanapun, kelakuannya apabila digunakan tanpa fungsi agregat (seperti SUM
, AVG
, COUNT
, dll.) dalam pernyataan SELECT
boleh berlawanan dengan intuisi, terutamanya dalam MySQL.
Mari kita gambarkan ini dengan contoh. Pertimbangkan jadual emp
dengan data pekerja:
name | dept | salary |
---|---|---|
Jack | a | 2 |
Jill | a | 1 |
Tom | b | 2 |
Fred | b | 1 |
Pertanyaan berikut:
<code class="language-sql">SELECT * FROM emp GROUP BY dept;</code>
mungkin nampaknya membayangkan mendapatkan semula semua jabatan yang berbeza. Walau bagaimanapun, output MySQL selalunya:
name | dept | salary |
---|---|---|
Jill | a | 1 |
Fred | b | 1 |
Mengapa Jill dan Fred, dan bukan Jack dan Tom?
Pengoptimuman GROUP BY
MySQL adalah puncanya. Tanpa fungsi agregat, MySQL boleh memilih nilai arbitrari untuk lajur yang tidak disertakan dalam klausa GROUP BY
. Pengoptimuman ini mengutamakan kelajuan, dengan mengandaikan (salah dalam kes ini) bahawa lajur bukan berkumpulan adalah konsisten dalam setiap kumpulan.
Perkara penting yang perlu diingat:
GROUP BY
tanpa fungsi agregat, pilihan nilai MySQL untuk lajur tersebut tidak dapat diramalkan.ORDER BY
Tidak Menjamin Determinisme: Menambah klausa ORDER BY
tidak menjadikan keputusan deterministik dalam konteks ini.Pertanyaan yang kelihatan mudah ini menyerlahkan kepentingan memasukkan secara eksplisit semua lajur tidak teragregat dalam klausa GROUP BY
untuk memastikan hasil yang boleh diramal dan boleh dipercayai. Jika tidak, anda berisiko memperoleh data yang tidak konsisten dan berkemungkinan mengelirukan.
Atas ialah kandungan terperinci Mengapakah MySQL GROUP BY Clause Menghasilkan Keputusan Yang Tidak Dijangka Tanpa Fungsi Agregat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!