Heim > Datenbank > MySQL-Tutorial > Warum erlaubt MySQL nicht aggregierte Spalten in GROUP BY-Abfragen?

Warum erlaubt MySQL nicht aggregierte Spalten in GROUP BY-Abfragen?

Susan Sarandon
Freigeben: 2024-12-07 05:57:15
Original
240 Leute haben es durchsucht

Why Does MySQL Allow Non-Aggregated Columns in GROUP BY Queries?

MySQL: Verständnis der Zulässigkeit der Auswahl nicht aggregierter Spalten in GROUP BY

In MySQL können Sie auf Szenarien stoßen, in denen eine Ansicht wie die folgende zulässig ist:

SELECT
     AVG(table_name.col1),
     AVG(table_name.col2),
     AVG(table_name.col3),
     table_name.personID,
     table_name.col4
FROM table_name
GROUP BY table_name.personID;
Nach dem Login kopieren

Diese Abfrage enthält eine Aggregatfunktion für Spalte 1, Spalte 2 und Spalte 3, wählt aber auch Spalte 4 ohne diese aus Aggregation. Normalerweise würde eine solche Abfrage in anderen Datenbanksystemen wie Microsoft SQL Server als ungültig angesehen.

In MySQL ist dieses Verhalten jedoch zulässig. Es ist wichtig zu verstehen, warum:

Beliebige Wertauswahl

Bei der Auswahl nicht aggregierter Spalten in einer GROUP BY-Abfrage wählt MySQL einen beliebigen Wert aus der Gruppe aus. Dies entspricht normalerweise dem Wert aus der zuerst in der Gruppe gespeicherten Zeile.

Mehrdeutige Abfragen

Diese Funktion kann zu mehrdeutigen Abfragen führen, bei denen der ausgewählte Wert für die nicht aggregierte Spalte je nach Wert variieren kann in der Reihenfolge der Zeilen in der Gruppe. Beispielsweise könnte die folgende Abfrage abhängig von der Zeilenreihenfolge unterschiedliche Werte für Spalte4 für dieselbe Personen-ID zurückgeben:

SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;
Nach dem Login kopieren

Funktionale Abhängigkeit

Um Mehrdeutigkeiten zu vermeiden, ist es wichtig, Spalten auszuwählen, die funktional sind abhängig von den Spalten in den GROUP BY-Kriterien. Das bedeutet, dass es für jeden eindeutigen Wert der Gruppierungsspalte(n) nur einen möglichen Wert für die Spalte „mehrdeutig“ geben sollte.

ONLY_FULL_GROUP_BY-Modus

MySQL stellt den SQL-Modus ONLY_FULL_GROUP_BY zur Verfügung kann aktiviert werden, damit MySQL dem ANSI SQL-Standard entspricht. In diesem Modus führt die Auswahl nicht aggregierter Spalten in einer GROUP BY-Abfrage zu einem Fehler, es sei denn, diese Spalten sind funktional von den Gruppierungsspalten abhängig.

Schlussfolgerung

Während MySQL die Auswahl nicht aggregierter Spalten zulässt Bei aggregierten Spalten in GROUP BY-Abfragen ist es wichtig, sich der Möglichkeit mehrdeutiger Ergebnisse bewusst zu sein. Um deterministische Abfragen sicherzustellen, wird empfohlen, sie so umzuschreiben, dass sie eindeutig nach funktional abhängigen Spalten gruppiert sind, oder den Modus ONLY_FULL_GROUP_BY zu aktivieren.

Das obige ist der detaillierte Inhalt vonWarum erlaubt MySQL nicht aggregierte Spalten in GROUP BY-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage