sql >> Databasteknik >  >> RDS >> Oracle

Varför Mysqls Group By och Oracles Group by beteenden är olika

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 av GROUP BY tillåter vallistan, HAVING skick, eller ORDER BY lista för att referera till icke aggregerade kolumner även om kolumnerna inte är funktionellt beroende av GROUP 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.



  1. Är det möjligt att fråga en kommaseparerad kolumn för ett specifikt värde?

  2. Lista över språk som stöds av Oracle Database

  3. SQL-spårning, händelse 10046 i Oracle:trcsess, tkprof-verktyg

  4. Konvertera 'datetime' till 'date' i SQL Server (T-SQL-exempel)