Projektanci MySQL umieścili swoje niestandardowe rozszerzenie w GROUP BY
w celu ułatwienia programowania i zwiększenia wydajności niektórych zapytań.
Oto ich uzasadnienie.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Istnieje tryb serwera o nazwie ONLY_FULL_GROUP_BY
co wyłącza niestandardowe rozszerzenia. Możesz ustawić ten tryb za pomocą tego oświadczenia.
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
Oto cytat z tej strony, z dodanym podkreśleniem.
Jeśli ONLY_FULL_GROUP_BY
jest wyłączone, rozszerzenie MySQL do standardowego użycia SQL GROUP BY
zezwala na listę wyboru, HAVING
warunek lub ORDER BY
lista do odwoływania się do kolumn niezagregowanych, nawet jeśli kolumny nie są funkcjonalnie zależne od GROUP BY
kolumny... W tym przypadku serwer może swobodnie wybrać dowolną wartość z każdej grupy , więc jeśli nie są takie same, wybrane wartości są niedeterministyczne , co prawdopodobnie nie jest tym, czego chcesz.
Ważnym słowem jest tutaj niedeterministyczny. Co to znaczy? To znaczy losowe, ale gorzej. Jeśli serwer wybrał losowe wartości, oznacza to, że zwróciłby różne wartości w różnych zapytaniach, więc masz szansę wychwycić problem podczas testowania oprogramowania. Ale niedeterministyczny w tym kontekście oznacza, że serwer za każdym razem wybiera tę samą wartość, aż tego nie robi.
Dlaczego może zmienić wybraną wartość? Jednym z powodów jest aktualizacja serwera. Inną może być zmiana rozmiaru stołu. Chodzi o to, że serwer może zwrócić dowolną wartość.
Chciałbym, aby ludzie, którzy dopiero uczą się SQL, ustawili to ONLY_FULL_GROUP_BY
tryb; uzyskaliby znacznie bardziej przewidywalne wyniki ze swoich zapytań, a serwer odrzuciłby zapytania niedeterministyczne.