Дизайнерите на 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
режим; те ще получат много по-предвидими резултати от своите заявки, а сървърът ще отхвърли недетерминистични заявки.