-
Oui. Les colonnes non agrégées sont toutes les colonnes qui n'utilisent pas de fonction d'agrégation comme
MAX
,COUNT
,SUM
,GROUP_CONCAT
, etc. -
Colonne
a
dépend fonctionnellement de la colonneb
si la valeur deb
implique une valeur particulière dea
. Cela signifie généralement queb
est une clé unique pour la table, eta
est une autre colonne de ce tableau. -
Déterminé de manière unique par est identique à la dépendance fonctionnelle.
-
L'alternative serait de lister toutes les colonnes non agrégées dans le
GROUP BY
list :GROUP BY a.Z, a.Y, a.X
.
La raison de tout cela est que lorsque vous sélectionnez des colonnes qui ne sont pas dans le GROUP BY
liste, ils proviendront de lignes arbitraires dans les lignes groupées. Cela conduit à de nombreuses erreurs courantes. Par exemple, une erreur courante consiste à écrire :
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
et attendez ip_address
pour contenir l'adresse de la connexion la plus récente pour chaque utilisateur. Mais il contiendra en fait tout des adresses à partir desquelles ils se sont connectés, et non celle de la ligne avec MAX(timestamp)
. Voir SQL Sélectionnez uniquement les lignes avec une valeur maximale sur une colonne
pour savoir comment procéder correctement.
L'exception de dépendance fonctionnelle est généralement utile avec les jointures.
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
Depuis user_id
est la clé primaire des users
table, il détermine de manière unique user_name
, il n'est donc pas nécessaire de le lister explicitement dans GROUP BY
.