Dans MySQL, vous pouvez rencontrer des scénarios dans lesquels une vue comme celle-ci est autorisée :
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;
Cette requête inclut une fonction d'agrégation pour col1, col2 et col3, mais elle sélectionne également col4 sans aucun agrégation. Normalement, une telle requête serait considérée comme invalide dans d'autres systèmes de bases de données comme Microsoft SQL Server.
Dans MySQL, cependant, ce comportement est autorisé. Il est important de comprendre pourquoi :
Lors de la sélection de colonnes non agrégées dans une requête GROUP BY, MySQL sélectionne une valeur arbitraire dans le groupe. Cela correspond généralement à la valeur de la ligne stockée en premier dans le groupe.
Cette fonctionnalité peut conduire à des requêtes ambiguës, où la valeur sélectionnée pour la colonne non agrégée peut varier en fonction sur l'ordre des lignes du groupe. Par exemple, la requête ci-dessous pourrait renvoyer différentes valeurs pour col4 pour le même personID en fonction de l'ordre des lignes :
SELECT AVG(table1.col1), table1.personID, persons.col4 FROM table1 JOIN persons ON (table1.personID = persons.id) GROUP BY table1.personID;
Pour éviter toute ambiguïté, il est crucial de sélectionner des colonnes fonctionnellement en fonction des colonnes des critères GROUP BY. Cela signifie qu'il ne doit y avoir qu'une seule valeur possible pour la colonne "ambiguë" pour chaque valeur unique de la ou des colonnes de regroupement.
MySQL fournit le mode SQL ONLY_FULL_GROUP_BY, qui peut être activé pour que MySQL adhère à la norme ANSI SQL. Dans ce mode, la sélection de colonnes non agrégées dans une requête GROUP BY entraînera une erreur, sauf si ces colonnes dépendent fonctionnellement des colonnes de regroupement.
Bien que MySQL permette de sélectionner des colonnes non agrégées colonnes agrégées dans les requêtes GROUP BY, il est essentiel d'être conscient du risque de résultats ambigus. Pour garantir des requêtes déterministes, il est recommandé de les réécrire pour qu'elles soient regroupées sans ambiguïté par colonnes fonctionnellement dépendantes ou d'activer le mode ONLY_FULL_GROUP_BY.
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!