-
Ja. Nicht aggregierte Spalten sind alle Spalten, die keine Aggregationsfunktion wie
MAX
verwenden ,COUNT
,SUM
,GROUP_CONCAT
usw. -
Spalte
a
ist funktional abhängig von Spalteb
wenn der Wert vonb
impliziert einen bestimmten Wert vona
. Dies bedeutet im Allgemeinen, dassb
ist ein eindeutiger Schlüssel für die Tabelle unda
ist 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 BY
aufzulisten 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 .