Дизайнерите на MySQL поставиха своето нестандартно разширение в GROUP BY в опит да направим разработката по-лесна и определени заявки по-ефективни.
Ето тяхната обосновка.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Има сървърен режим, наречен ONLY_FULL_GROUP_BY което деактивира нестандартните разширения. Можете да зададете този режим с помощта на това изявление.
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
Ето цитат от тази страница, с добавен акцент.
Ако
ONLY_FULL_GROUP_BYе деактивиран, MySQL разширение към стандартното използване на SQL наGROUP BYразрешава списъка за избор,HAVINGусловие илиORDER BYсписък за препращане към неагрегирани колони, дори ако колоните не са функционално зависими отGROUP BYколони... В този случай сървърът е свободен да избере произволна стойност от всяка група , така че освен ако не са еднакви, избраните стойности са недетерминирани , което вероятно не е това, което искате.
Важната дума тук е недетерминистично Какво означава това? Това означава случайно, но по-лошо. Ако сървърът избере произволни стойности, това означава, че ще върне различни стойности в различни заявки, така че имате шанс да хванете проблема, когато тествате софтуера си. Но недетерминистично в този контекст означава, че сървърът избира една и съща стойност всеки път, докато не го направи.
Защо може да промени избраната от него стойност? Надстройката на сървъра е една от причините. Промяната в размера на таблицата може да е друга. Въпросът е, че сървърът е свободен да върне каквато и стойност иска.
Иска ми се хората, които наскоро изучават SQL, да задават това ONLY_FULL_GROUP_BY режим; те ще получат много по-предвидими резултати от своите заявки, а сървърът ще отхвърли недетерминистични заявки.