Perancang MySQL memasukkan ekstensi tidak standar mereka ke GROUP BY
dalam upaya membuat pengembangan lebih mudah dan kueri tertentu lebih efisien.
Berikut alasan mereka.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Ada mode server yang disebut ONLY_FULL_GROUP_BY
yang menonaktifkan ekstensi tidak standar. Anda dapat mengatur mode ini menggunakan pernyataan ini.
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
Berikut kutipan dari halaman itu, dengan penekanan ditambahkan.
Jika
ONLY_FULL_GROUP_BY
dinonaktifkan, ekstensi MySQL ke SQL standar menggunakanGROUP BY
mengizinkan daftar pilih,HAVING
kondisi, atauORDER BY
list untuk merujuk ke kolom yang tidak diagregasi meskipun kolom tidak bergantung secara fungsional padaGROUP BY
kolom... Dalam hal ini, server bebas memilih nilai apa pun dari setiap grup , jadi kecuali keduanya sama, nilai yang dipilih adalah nondeterministik , yang mungkin bukan yang Anda inginkan.
Kata yang penting di sini adalah nondeterministik. Apa artinya? Artinya acak, tapi lebih buruk. Jika server memilih nilai acak, itu berarti ia akan mengembalikan nilai yang berbeda dalam kueri yang berbeda, jadi Anda memiliki peluang untuk menangkap masalah saat Anda menguji perangkat lunak Anda. Tapi nondeterministik dalam konteks ini berarti server memilih nilai yang sama setiap saat, sampai tidak.
Mengapa itu bisa mengubah nilai yang dipilihnya? Upgrade server adalah salah satu alasannya. Perubahan ukuran tabel mungkin lain. Intinya, server bebas mengembalikan nilai apa pun yang diinginkannya.
Saya berharap orang yang baru belajar SQL akan mengatur ONLY_FULL_GROUP_BY
ini mode; mereka akan mendapatkan hasil yang jauh lebih dapat diprediksi dari kueri mereka, dan server akan menolak kueri nondeterministik.