Dans MySQL, il est possible de sélectionner une colonne non incluse dans une fonction d'agrégation ou dans le GROUP BY clause, ce qui peut prêter à confusion pour les programmeurs provenant d'autres bases de données SQL. Ce comportement s'écarte de la norme ANSI SQL, qui exige que toutes les colonnes sélectionnées fassent partie du regroupement ou apparaissent dans une fonction d'agrégation.
Requêtes ambiguës et sélection de valeurs arbitraires
Lorsque MySQL rencontre une telle requête, il renvoie silencieusement une valeur arbitraire de la colonne de chaque groupe, généralement la valeur de la première ou de la dernière ligne du groupe. Ce comportement peut conduire à des résultats ambigus, surtout si les valeurs de la colonne non groupée ne sont pas cohérentes au sein de chaque groupe.
Exemple de requête
Considérez la requête MySQL suivante :
SELECT AVG(table_name.col1), AVG(table_name.col2), AVG(table_name.col3), table_name.personID, table_name.col4 FROM table_name GROUP BY table_name.personID;
Dans cette requête, col4 ne fait pas partie de la clause GROUP BY ni d'une fonction d'agrégation. MySQL sélectionnera arbitrairement une valeur pour col4 pour chaque groupe. Cela peut être problématique si différentes lignes au sein d'un groupe ont des valeurs différentes pour col4.
Dépendance fonctionnelle et résultats déterministes
MySQL permet de sélectionner des colonnes non groupées lorsqu'elles sont fonctionnellement dépend de la ou des colonnes de la clause GROUP BY. Cela signifie que pour chaque valeur de la ou des colonnes de regroupement, il n'y a qu'une seule valeur possible pour la colonne non groupée. Dans de tels cas, la requête renverra un résultat déterministe.
Cependant, il est important de noter que le comportement de MySQL avec des requêtes ambiguës peut changer dans les versions futures. Par conséquent, il est recommandé d'éviter d'utiliser des colonnes non groupées dans les clauses SELECT à moins qu'elles ne soient explicitement incluses dans la clause GROUP BY ou dans une fonction d'agrégation.
Mode SQL "ONLY_FULL_GROUP_BY"
MySQL 5.7 a introduit le mode SQL "ONLY_FULL_GROUP_BY", qui applique la norme ANSI SQL pour GROUP BY requêtes. Lorsque ce mode est activé, la sélection de colonnes non groupées sans fonction d'agrégation entraînera une erreur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!