To prawda, że ta funkcja zezwala na niektóre niejednoznaczne zapytania i po cichu zwraca zestaw wyników z dowolną wartością wybraną z tej kolumny. W praktyce zwykle jest to wartość z wiersza w grupie, która jest fizycznie przechowywana jako pierwsza.
Te zapytania nie są niejednoznaczne, jeśli wybierzesz tylko kolumny, które są funkcjonalnie zależne od kolumn w kryteriach GROUP BY. Innymi słowy, jeśli może istnieć tylko jedna odrębna wartość kolumny „niejednoznacznej” na wartość definiującą grupę, nie ma problemu. To zapytanie byłoby nielegalne w Microsoft SQL Server (i ANSI SQL), nawet jeśli logicznie nie może powodować niejednoznaczności:
SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;
Ponadto MySQL ma tryb SQL, dzięki któremu zachowuje się zgodnie ze standardem:ONLY_FULL_GROUP_BY
FWIW, SQLite zezwala również na te niejednoznaczne klauzule GROUP BY, ale wybiera wartość z ostatniej wiersz w grupie.
Przynajmniej w wersji, którą testowałem. Co to znaczy być dowolnym jest to, że MySQL lub SQLite mogą zmienić swoją implementację w przyszłości i mieć inne zachowanie. Dlatego nie powinieneś polegać na tym, że zachowanie pozostanie takie, jakie jest obecnie w niejednoznacznych przypadkach, takich jak ten. Lepiej jest przepisać zapytania, aby były deterministyczne i nie dwuznaczne. Dlatego MySQL 5.7 domyślnie włącza teraz ONLY_FULL_GROUP_BY.