MySQL-designerna lägger in sitt icke-standardiserade tillägg till GROUP BY
i ett försök att göra utvecklingen lättare och vissa frågor mer effektiva.
Här är deras motivering.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Det finns ett serverläge som heter ONLY_FULL_GROUP_BY
vilket inaktiverar de icke-standardiserade tilläggen. Du kan ställa in det här läget med detta uttalande.
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
Här är ett citat från den sidan, med betoning.
Om
ONLY_FULL_GROUP_BY
är inaktiverat, ett MySQL-tillägg till standard SQL-användning avGROUP BY
tillåter vallistan,HAVING
skick, ellerORDER BY
lista för att referera till icke aggregerade kolumner även om kolumnerna inte är funktionellt beroende avGROUP BY
kolumner... I det här fallet är servern fri att välja valfritt värde från varje grupp , så om de inte är samma, är de valda värdena icke-deterministiska , vilket förmodligen inte är vad du vill ha.
Det viktiga ordet här är icke-deterministiskt. Vad betyder det? Det betyder slumpmässigt, men värre. Om servern valde slumpmässiga värden, innebär det att den skulle returnera olika värden i olika frågor, så att du har en chans att fånga problemet när du testar din programvara. Men icke-deterministisk i detta sammanhang betyder det att servern väljer samma värde varje gång, tills den inte gör det.
Varför kan det ändra värdet det väljer? En serveruppgradering är en anledning. En förändring av tabellstorleken kan vara en annan. Poängen är att servern är fri att returnera vilket värde den vill ha.
Jag önskar att folk som nyligen lärt sig SQL skulle ställa in denna ONLY_FULL_GROUP_BY
läge; de skulle få mycket mer förutsägbara resultat från sina frågor, och servern skulle avvisa icke-deterministiska frågor.