Maison >base de données >tutoriel mysql >Pourquoi MySQL autorise-t-il les colonnes non agrégées dans les requêtes GROUP BY ?

Pourquoi MySQL autorise-t-il les colonnes non agrégées dans les requêtes GROUP BY ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-07 05:57:15212parcourir

Why Does MySQL Allow Non-Aggregated Columns in GROUP BY Queries?

MySQL : Comprendre la possibilité de sélectionner des colonnes non agrégées dans GROUP BY

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 :

Sélection de valeurs arbitraires

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.

Requêtes ambiguës

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;

Dépendance fonctionnelle

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.

Mode ONLY_FULL_GROUP_BY

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.

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn