Maison >base de données >tutoriel mysql >Le comportement non standard de la clause GROUP BY de MySQL présente-t-il des risques pour les requêtes agrégées ?
Introduction
Les utilisateurs de Microsoft SQL Server rencontrent un extrait de la documentation MySQL qui accorde à MySQL la possibilité de sélectionner des colonnes non groupées dans les requêtes agrégées. Cette pratique contredit la norme SQL, soulevant des questions sur sa légalité et ses implications.
Restriction SQL standard
La norme SQL-92 interdit de sélectionner des champs non agrégés qui ne relèvent pas de la norme SQL. la clause GROUP BY dans les requêtes agrégées. Ceci permet de garantir l'intégrité des données renvoyées et d'éviter des résultats ambigus.
Extension de MySQL
Cependant, depuis MySQL 5.5, il a étendu la clause GROUP BY pour permettre la sélection de colonnes non agrégées, même si elles ne dépendent pas fonctionnellement du regroupement colonnes.
Violation de la norme
Cette extension va à l'encontre de la norme SQL-2003, qui exige que les champs non agrégés soient fonctionnellement dépendants des colonnes de regroupement ou inclus dans une expression agrégée.
Pourquoi MySQL implémenté L'implémentation par MySQL de cette extension s'aligne sur l'intention de la norme SQL-2003 d'améliorer les performances en réduisant le tri et le regroupement inutiles des colonnes. Cependant, l'implémentation de MySQL s'écarte de la norme en autorisant toutes les colonnes, pas seulement celles qui sont fonctionnellement dépendantes.
Conséquences de l'extension
Cette extension comporte un potentiel d'erreurs indéterminées. résultats si les colonnes non agrégées n’ont pas de valeurs cohérentes au sein de chaque groupe. Les développeurs doivent faire preuve de prudence pour garantir la validité de leurs requêtes dans le cadre de ce mécanisme de regroupement assoupli.
Comportement de SQL Server
Contrairement à MySQL, SQL Server adhère strictement au SQL-92 standard, interdisant la sélection de champs non agrégés ne faisant pas partie du GROUP BY
Solution de contournement
Pour restreindre MySQL au comportement standard, définissez sql_mode sur "ONLY_FULL_GROUP_BY".
Nouvelles améliorations de MySQL
Dans MySQL 5.7, la gestion améliorée de GROUP BY reconnaît les fonctionnalités dépendances, mieux alignées sur la norme SQL-2003.
Conclusion
L'extension MySQL de la clause GROUP BY permet aux développeurs de sélectionner des colonnes non groupées dans des requêtes agrégées. Même si cet écart par rapport à la norme peut améliorer les performances, il introduit un risque de résultats indéterminés. Pour éviter de tels pièges, les développeurs doivent faire preuve de prudence avec les colonnes non agrégées et envisager le mode "ONLY_FULL_GROUP_BY" de MySQL pour un strict respect de la norme.
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!