-
Ja. Nicht aggregierte Spalten sind alle Spalten, die keine Aggregationsfunktion wie
MAXverwenden ,COUNT,SUM,GROUP_CONCATusw. -
Spalte
aist funktional abhängig von Spaltebwenn der Wert vonbimpliziert einen bestimmten Wert vona. Dies bedeutet im Allgemeinen, dassbist ein eindeutiger Schlüssel für die Tabelle undaist eine andere Spalte in dieser Tabelle. -
Eindeutig bestimmt durch ist dasselbe wie funktionale Abhängigkeit.
-
Die Alternative wäre, alle nicht aggregierten Spalten im
GROUP BYaufzulisten Liste:GROUP BY a.Z, a.Y, a.X.
Der Grund für all dies liegt darin, dass Sie Spalten auswählen, die nicht in GROUP BY enthalten sind Liste, kommen sie aus beliebigen Zeilen in den gruppierten Zeilen. Dies führt zu vielen häufigen Fehlern. Ein häufiger Fehler ist zum Beispiel zu schreiben:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
und erwarten Sie ip_address um die Adresse der letzten Anmeldung für jeden Benutzer zu enthalten. Aber es wird tatsächlich beliebige enthalten der Adressen, von denen sie sich eingeloggt haben, nicht die aus der Zeile mit MAX(timestamp) . Siehe SQL Select only rows with Max Value on a Column
für die richtige Vorgehensweise.
Die funktionale Abhängigkeitsausnahme ist normalerweise bei Joins nützlich.
SELECT u.user_id, u.user_name, MAX(l.timestamp)
FROM users AS u
JOIN user_logins AS l ON u.user_id = l.user_id
GROUP BY u.user_id
Seit user_id ist der Primärschlüssel der users Tabelle bestimmt user_name eindeutig , daher ist es nicht notwendig, dies explizit in GROUP BY aufzulisten .