Návrháři MySQL vložili své nestandardní rozšíření na GROUP BY
ve snaze usnadnit vývoj a zefektivnit některé dotazy.
Tady je jejich zdůvodnění.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Existuje serverový režim nazvaný ONLY_FULL_GROUP_BY
který zakáže nestandardní rozšíření. Tento režim můžete nastavit pomocí tohoto příkazu.
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
Zde je citát z této stránky s přidaným důrazem.
Pokud
ONLY_FULL_GROUP_BY
je zakázáno, rozšíření MySQL ke standardnímu použití SQLGROUP BY
povoluje výběrový seznamHAVING
podmínkou neboORDER BY
seznam odkazovat na neagregované sloupce, i když sloupce nejsou funkčně závislé naGROUP BY
sloupce... V tomto případě si server může volně vybrat libovolnou hodnotu z každé skupiny , takže pokud nejsou stejné, zvolené hodnoty jsou nedeterministické , což pravděpodobně není to, co chcete.
Zde je důležité slovo nedeterministický. Co to znamená? Znamená to náhodné, ale horší. Pokud server zvolil náhodné hodnoty, znamená to, že by v různých dotazech vrátil různé hodnoty, takže máte šanci zachytit problém při testování softwaru. Ale nedeterministický v tomto kontextu to znamená, že server pokaždé zvolí stejnou hodnotu, dokud tak neučiní.
Proč může změnit hodnotu, kterou si zvolí? Upgrade serveru je jedním z důvodů. Změna velikosti tabulky může být další. Jde o to, že server může vrátit jakoukoli hodnotu, kterou chce.
Přál bych si, aby lidé, kteří se nově učí SQL, nastavili toto ONLY_FULL_GROUP_BY
režim; ze svých dotazů by získali mnohem předvídatelnější výsledky a server by odmítal nedeterministické dotazy.