Hasil yang tidak dapat diramalkan apabila MySQL GROUP BY
klausa tidak mempunyai fungsi agregat
Apabila melaksanakan pertanyaan GROUP BY
tanpa menggunakan fungsi agregat, hasil yang dikembalikan mungkin tidak dapat diramalkan, seperti yang ditunjukkan oleh contoh MySQL berikut.
<code class="language-sql">SELECT * FROM emp GROUP BY dept</code>
Pertanyaan ini mendapatkan semula semua lajur tanpa sebarang pengagregatan, menyebabkan hasil yang tidak dijangka: "Jill" dan "Fred" dikembalikan dan "Jack" dan "Tom" dikecualikan.
Punca Punca
Menurut dokumentasi MySQL, tingkah laku yang tidak dapat diramalkan ini berpunca daripada niat pelayan untuk menghilangkan lajur pendua daripada klausa GROUP BY
untuk mengoptimumkan prestasi. Walau bagaimanapun, pengoptimuman ini hanya berfungsi apabila lajur yang ditinggalkan mempunyai nilai yang sama dalam setiap kumpulan.
Jika tiada fungsi agregat, MySQL tidak menguatkuasakan bahawa nilai lajur yang ditinggalkan mestilah sama. Sebaliknya, ia sewenang-wenangnya memilih nilai dalam setiap kumpulan, menjadikan keputusan tidak pasti dan tidak boleh dipercayai.
Kesan ke atas integriti data
Tingkah laku ini mempunyai implikasi penting untuk jenis pertanyaan berikut:
<code class="language-sql">SELECT A.*, MIN(A.salary) AS min_salary FROM emp AS A GROUP BY A.dept</code>
Pertanyaan sedemikian mungkin mengembalikan hasil yang tidak muktamad, mengakibatkan maklumat yang tidak boleh dipercayai.
Amalan Terbaik: Pastikan Konsisten
Untuk memastikan hasil yang konsisten dan boleh diramal, adalah disyorkan untuk menyatakan secara eksplisit semua lajur yang diperlukan dalam klausa GROUP BY
. Ini menghapuskan risiko kehilangan lajur dengan nilai yang berbeza, memastikan keputusan yang pasti.
Kesimpulan
Walaupun mengabaikan lajur tertentu daripada GROUP BY
boleh meningkatkan prestasi, adalah penting untuk memahami kemungkinan akibat. Dengan mematuhi amalan terbaik dan menyatakan lajur secara eksplisit dalam klausa GROUP BY
, pengaturcara boleh memastikan kebolehpercayaan dan ketepatan hasil pertanyaan.
Atas ialah kandungan terperinci Mengapa pertanyaan MySQL GROUP BY tanpa fungsi agregat tidak dapat diramalkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!