In MySQL ist es möglich, eine Spalte auszuwählen, die nicht in einer Aggregatfunktion oder der GROUP BY enthalten ist Klausel, die für Programmierer, die mit anderen SQL-Datenbanken arbeiten, verwirrend sein kann. Dieses Verhalten weicht vom ANSI-SQL-Standard ab, der erfordert, dass alle ausgewählten Spalten Teil der Gruppierung sind oder in einer Aggregatfunktion erscheinen.
Mehrdeutige Abfragen und willkürliche Werteauswahl
Wenn MySQL auf eine solche Abfrage stößt, gibt es stillschweigend einen beliebigen Wert aus der Spalte für jede Gruppe zurück, normalerweise den Wert aus der ersten oder letzten Zeile in der Gruppe. Dieses Verhalten kann zu mehrdeutigen Ergebnissen führen, insbesondere wenn die Werte in der nicht gruppierten Spalte nicht innerhalb jeder Gruppe konsistent sind.
Beispielabfrage
Betrachten Sie die folgende MySQL-Abfrage :
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;
In dieser Abfrage ist Spalte4 nicht Teil der GROUP BY-Klausel oder einer Aggregatfunktion. MySQL wählt für jede Gruppe willkürlich einen Wert für col4 aus. Dies kann problematisch sein, wenn verschiedene Zeilen innerhalb einer Gruppe unterschiedliche Werte für Spalte4 haben.
Funktionale Abhängigkeit und deterministische Ergebnisse
MySQL ermöglicht die Auswahl nicht gruppierter Spalten, wenn diese funktional sind abhängig von der/den Spalte(n) in der GROUP BY-Klausel. Das bedeutet, dass es für jeden Wert der Gruppierungsspalte(n) nur einen möglichen Wert für die nicht gruppierte Spalte gibt. In solchen Fällen liefert die Abfrage ein deterministisches Ergebnis.
Es ist jedoch wichtig zu beachten, dass sich das Verhalten von MySQL bei mehrdeutigen Abfragen in zukünftigen Versionen ändern kann. Daher wird empfohlen, die Verwendung nicht gruppierter Spalten in SELECT-Klauseln zu vermeiden, es sei denn, sie sind explizit in der GROUP BY-Klausel oder einer Aggregatfunktion enthalten.
SQL-Modus „ONLY_FULL_GROUP_BY“
MySQL 5.7 führte den SQL-Modus „ONLY_FULL_GROUP_BY“ ein, der den ANSI-SQL-Standard für GROUP BY-Abfragen erzwingt. Wenn dieser Modus aktiviert ist, führt die Auswahl nicht gruppierter Spalten ohne Aggregatfunktion zu einem Fehler.
Das obige ist der detaillierte Inhalt vonWarum erlaubt MySQL die Auswahl von Spalten, die nicht in der GROUP BY-Klausel enthalten sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!