Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum sich das Group By-Verhalten von Mysql und das Group By-Verhalten von Oracle unterscheiden

Die MySQL-Designer fügten ihre nicht standardmäßige Erweiterung zu GROUP BY hinzu in einem Versuch, die Entwicklung einfacher und bestimmte Abfragen effizienter zu machen.

Hier ist ihre Begründung.

https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

Es gibt einen Servermodus namens ONLY_FULL_GROUP_BY wodurch die nicht standardmäßigen Erweiterungen deaktiviert werden. Sie können diesen Modus mit dieser Anweisung einstellen.

 SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'  

Hier ist ein Zitat von dieser Seite, mit Hervorhebung hinzugefügt.

Wenn ONLY_FULL_GROUP_BY ist deaktiviert, eine MySQL-Erweiterung zur Standard-SQL-Nutzung von GROUP BY erlaubt die Auswahlliste, HAVING Bedingung oder ORDER BY list auf nicht aggregierte Spalten verweisen, selbst wenn die Spalten nicht funktional von GROUP BY abhängig sind Spalten... In diesem Fall kann der Server jeden Wert aus jeder Gruppe auswählen , daher sind die gewählten Werte nicht deterministisch, sofern sie nicht gleich sind , was wahrscheinlich nicht das ist, was Sie wollen.

Das wichtige Wort hier ist nicht deterministisch. Was bedeutet das? Es bedeutet zufällig, aber schlimmer. Wenn der Server zufällige Werte auswählt, bedeutet dies, dass er in verschiedenen Abfragen unterschiedliche Werte zurückgeben würde, sodass Sie beim Testen Ihrer Software eine Chance haben, das Problem zu erkennen. Aber nicht deterministisch bedeutet in diesem Zusammenhang, dass der Server jedes Mal denselben Wert wählt, bis er es nicht mehr tut.

Warum könnte es den gewählten Wert ändern? Ein Server-Upgrade ist ein Grund. Eine Änderung der Tabellengröße könnte eine andere sein. Der Punkt ist, dass es dem Server freisteht, jeden beliebigen Wert zurückzugeben.

Ich wünschte, Leute, die neu SQL lernen, würden diesen ONLY_FULL_GROUP_BY setzen Modus; Sie würden viel vorhersehbarere Ergebnisse aus ihren Abfragen erhalten, und der Server würde nicht deterministische Abfragen ablehnen.