Klausa GROUP BY
MySQL: Memahami Pertanyaan Bukan Agregat
MySQL GROUP BY
, apabila digunakan tanpa fungsi agregat dalam pernyataan SELECT
, mempamerkan gelagat unik. Walaupun nampaknya membenarkan peninggalan lajur daripada kumpulan, fungsi ini bergantung pada andaian penting: lajur yang ditinggalkan mesti mempunyai nilai yang sama dalam setiap kumpulan.
Keputusan Tidak Tentu: Perangkap Kelalaian
Jika lajur yang ditinggalkan mengandungi nilai yang berbeza-beza dalam kumpulan, keputusan menjadi tidak dapat diramalkan. MySQL memilih nilai arbitrari daripada setiap kumpulan untuk lajur yang ditinggalkan. Ini bermakna output tidak boleh dipercayai secara konsisten.
Pengoptimuman MySQL dan Implikasinya
Teknik pengoptimuman MySQL kadangkala membenarkan peninggalan lajur dalam GROUP BY
untuk meningkatkan prestasi. Walau bagaimanapun, pengoptimuman ini bergantung pada andaian nilai malar yang dinyatakan di atas dalam setiap kumpulan. Melanggar andaian ini membawa kepada keputusan tidak tentu yang dibincangkan di atas.
Memastikan Boleh Dipercayai GROUP BY
Pertanyaan
Untuk hasil yang boleh diramal dan boleh dipercayai, amalan terbaik untuk memasukkan semua lajur yang berkaitan secara eksplisit dalam klausa GROUP BY
. Sebagai alternatif, jika meringkaskan data ialah matlamat, gunakan fungsi agregat (seperti MAX
, MIN
, AVG
, SUM
, dsb.) untuk mendapatkan hasil yang pasti.
Pendekatan Lebih Deterministik
Untuk mengelakkan kekaburan tingkah laku GROUP BY
tersirat, pertimbangkan pertanyaan alternatif ini:
<code class="language-sql">SELECT A.* FROM emp AS A WHERE A.salary = ( SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept );</code>
Pendekatan ini secara langsung memilih baris berdasarkan gaji maksimum dalam setiap jabatan, memberikan hasil yang jelas dan konsisten.
Atas ialah kandungan terperinci Bagaimanakah Klausa `GROUP BY` MySQL Bertindak Tanpa Fungsi Agregat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!