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

MySQL - Sélection d'une colonne non groupée par

Il est vrai que cette fonctionnalité autorise certaines requêtes ambiguës et renvoie silencieusement un ensemble de résultats avec une valeur arbitraire choisie dans cette colonne. En pratique, il s'agit généralement de la valeur de la ligne du groupe qui est physiquement stockée en premier.

Ces requêtes ne sont pas ambiguës si vous ne choisissez que des colonnes qui dépendent fonctionnellement de la ou des colonnes dans les critères GROUP BY. En d'autres termes, s'il ne peut y avoir qu'une seule valeur distincte de la colonne "ambigüe" par valeur qui définit le groupe, il n'y a pas de problème. Cette requête serait illégale dans Microsoft SQL Server (et ANSI SQL), même si elle ne peut logiquement pas entraîner d'ambiguïté :

SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;

De plus, MySQL dispose d'un mode SQL pour qu'il se comporte selon la norme :ONLY_FULL_GROUP_BY

FWIW, SQLite autorise également ces clauses GROUP BY ambiguës, mais il choisit la valeur du dernier rangée dans le groupe.

Du moins dans la version que j'ai testé. Ce que signifie être arbitraire est que MySQL ou SQLite pourraient changer leur implémentation à l'avenir et avoir un comportement différent. Vous ne devez donc pas compter sur le comportement restant tel qu'il est actuellement dans des cas ambigus comme celui-ci. Il est préférable de réécrire vos requêtes pour qu'elles soient déterministes et non ambiguës. C'est pourquoi MySQL 5.7 active désormais ONLY_FULL_GROUP_BY par défaut.