MySQL und PostgreSQL GROUP BY
Klausel: Ein Vergleich
MySQL und PostgreSQL, beliebte relationale Datenbanksysteme, behandeln die GROUP BY
-Klausel unterschiedlich. Diese Klausel gruppiert Zeilen basierend auf angegebenen Spalten und ermöglicht so Aggregatfunktionsberechnungen für gruppierte Daten. Lassen Sie uns die wichtigsten Unterschiede untersuchen.
Ein häufiges Szenario umfasst eine Tabelle (z. B. the_table
) mit den Spalten col1
, col2
und col3
. In MySQL könnte eine Abfrage wie SELECT col2, col3, col1 FROM the_table GROUP BY col2;
Ergebnisse zurückgeben und scheinbar beliebige Werte für col3
und col1
innerhalb jeder col2
-Gruppe auswählen. Allerdings erzeugt dieselbe Abfrage in PostgreSQL einen Fehler.
Warum der PostgreSQL-Fehler?
PostgreSQL hält sich strikt an den SQL-Standard. Der Standard schreibt vor, dass jede Spalte in der SELECT
-Liste, die nicht in der GROUP BY
-Klausel enthalten ist, Teil einer Aggregatfunktion sein muss. In unserem Beispiel verstoßen col3
und col1
gegen diese Regel.
Aggregatfunktionen erklärt
Aggregatfunktionen (wie MIN
, MAX
, AVG
, SUM
, COUNT
) berechnen einen einzelnen Wert aus mehreren Zeilen. Sie sind für die Zusammenfassung gruppierter Daten unerlässlich.
Das nicht standardmäßige Verhalten von MySQL
Das Verhalten von MySQL weicht vom Standard ab. Es ermöglicht die Auswahl nicht aggregierter Spalten, die nicht in der GROUP BY
-Klausel enthalten sind, aber das ist unzuverlässig. Die ausgewählten Werte für diese Spalten sind unvorhersehbar und hängen von den internen Abläufen der Datenbank ab; Es kann nicht garantiert werden, dass sie konsistent sind.
Standardkonforme Abfragen
Um konsistente und vorhersehbare Ergebnisse in beiden Datenbanken sicherzustellen, verwenden Sie immer Aggregatfunktionen für Spalten, die nicht in der GROUP BY
-Klausel enthalten sind. Die folgende Abfrage funktioniert sowohl in MySQL als auch in PostgreSQL korrekt:
<code class="language-sql">SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1 FROM the_table GROUP BY col2;</code>
Diese Abfrage verwendet MIN()
, um den Mindestwert von col3
und col1
für jede col2
-Gruppe zu ermitteln und liefert so klar definierte Ergebnisse. Durch Ersetzen von MIN()
durch andere Aggregatfunktionen wie MAX()
, AVG()
usw. werden unterschiedliche zusammenfassende Statistiken für jede Gruppe bereitgestellt. Dieser Ansatz garantiert die Standard-SQL-Konformität und vermeidet die Mehrdeutigkeit, die mit der nicht standardmäßigen GROUP BY
-Erweiterung von MySQL einhergeht.
Das obige ist der detaillierte Inhalt vonWarum funktioniert eine „GROUP BY'-Klausel in MySQL und PostgreSQL unterschiedlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!