-
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
adépend fonctionnellement de la colonnebsi la valeur debimplique une valeur particulière dea. Cela signifie généralement quebest une clé unique pour la table, etaest 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 BYlist :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 .