Dalam MySQL, anda mungkin menghadapi senario di mana paparan seperti berikut dibenarkan:
SELECT AVG(table_name.col1), AVG(table_name.col2), AVG(table_name.col3), table_name.personID, table_name.col4 FROM table_name GROUP BY table_name.personID;
Pertanyaan ini termasuk fungsi agregat untuk col1, col2, dan col3, tetapi ia juga memilih col4 tanpa sebarang pengagregatan. Biasanya, pertanyaan sedemikian akan dianggap tidak sah dalam sistem pangkalan data lain seperti Microsoft SQL Server.
Walau bagaimanapun, dalam MySQL, tingkah laku ini dibenarkan. Adalah penting untuk memahami sebab:
Apabila memilih lajur tidak teragregat dalam pertanyaan GROUP BY, MySQL memilih nilai arbitrari daripada kumpulan. Ini biasanya sepadan dengan nilai daripada baris yang disimpan dahulu dalam kumpulan.
Ciri ini boleh membawa kepada pertanyaan samar-samar, di mana nilai yang dipilih untuk lajur tidak teragregat mungkin berbeza-beza berdasarkan mengikut susunan baris dalam kumpulan. Sebagai contoh, pertanyaan di bawah boleh mengembalikan nilai yang berbeza untuk col4 untuk personID yang sama bergantung pada susunan baris:
SELECT AVG(table1.col1), table1.personID, persons.col4 FROM table1 JOIN persons ON (table1.personID = persons.id) GROUP BY table1.personID;
Untuk mengelakkan kekaburan, adalah penting untuk memilih lajur yang berfungsi bergantung pada lajur dalam kriteria GROUP BY. Ini bermakna bahawa hanya perlu ada satu nilai yang mungkin untuk lajur "kabur" untuk setiap nilai unik lajur pengelompokan.
MySQL menyediakan mod SQL SAHAJA_FULL_GROUP_BY, yang boleh didayakan untuk menjadikan MySQL mematuhi standard ANSI SQL. Dalam mod ini, memilih lajur tidak teragregat dalam pertanyaan KUMPULAN OLEH akan mengakibatkan ralat, melainkan lajur tersebut bergantung secara fungsi pada lajur pengumpulan.
Sementara MySQL membenarkan pemilihan bukan- lajur agregat dalam pertanyaan GROUP BY, adalah penting untuk mengetahui potensi hasil yang tidak jelas. Untuk memastikan pertanyaan deterministik, adalah disyorkan untuk menulis semula pertanyaan itu untuk dikumpulkan dengan jelas mengikut lajur yang bergantung pada fungsi atau untuk mendayakan mod ONLY_FULL_GROUP_BY.
Atas ialah kandungan terperinci Mengapa MySQL Membenarkan Lajur Tidak Agregat dalam GROUP BY Queries?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!