Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL 5.7 et only_full_group_by

  1. 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.

  2. Colonne a dépend fonctionnellement de la colonne b si la valeur de b implique une valeur particulière de a . Cela signifie généralement que b est une clé unique pour la table, et a est une autre colonne de ce tableau.

  3. Déterminé de manière unique par est identique à la dépendance fonctionnelle.

  4. 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 .