Extension de MySQL à GROUP BY : adhésion ou écart par rapport à la norme SQL ?
Introduction
Traditionnellement dans SQL Server et autres SGBDR, sélection de colonnes non agrégées qui ne font pas partie de la clause GROUP BY dans une requête agrégée est interdite par le standard SQL. Cependant, dans MySQL, ce comportement s'écarte de la norme, soulevant des questions sur l'adhésion de MySQL.
Groupe étendu BY de MySQL
Dans les versions SQL jusqu'en 1992, la norme en effet interdit la sélection de champs non agrégés non inclus dans la clause GROUP BY. Cependant, à partir de SQL-2003, la norme permet de sélectionner des colonnes qui dépendent fonctionnellement des colonnes de regroupement.
MySQL, dans son empressement à implémenter cette nouvelle norme, a étendu GROUP BY pour permettre la sélection de toutes les colonnes. , pas seulement ceux qui dépendent fonctionnellement des colonnes de regroupement. Bien que cette extension soit conforme aux dernières normes SQL, son implémentation s'écarte du comportement prévu.
Conséquences de l'extension MySQL
Autoriser toutes les colonnes de la liste SELECT, même celles non fonctionnellement dépendants, peut conduire à des résultats indéterminés si les colonnes non groupées contiennent des valeurs différentes au sein d'un groupe. Cet écart par rapport à la norme peut provoquer de la confusion et un comportement imprévisible pour les utilisateurs.
Pour résoudre ce problème, MySQL a introduit le ONLY_FULL_GROUP_BY sql_mode, qui désactive le comportement GROUP BY étendu de MySQL et revient au SQL plus restrictif. -92.
Justification de MySQL et comparaison avec d'autres SGBDR
La justification de MySQL pour cette extension est l'optimisation des performances. En autorisant toutes les colonnes de la liste SELECT, MySQL peut éviter les tris et regroupements inutiles, ce qui entraîne des améliorations de performances.
Cependant, d'autres SGBDR tels que PostgreSQL et les versions ultérieures de MySQL (5.7) ont implémenté des approches plus conformes aux normes. en reconnaissant les dépendances fonctionnelles et en limitant en conséquence les colonnes non agrégées dans la liste SELECT. Cela garantit à la fois les performances et le respect de la norme SQL.
Conclusion
Le GROUP BY étendu de MySQL, bien qu'inspiré de la norme SQL, s'écarte de sa mise en œuvre prévue. Cette extension peut conduire à des résultats indéterminés et nécessite une compréhension plus nuancée de la dépendance fonctionnelle. En définissant le ONLY_FULL_GROUP_BY sql_mode, les utilisateurs peuvent revenir au comportement SQL-92 plus restrictif. Les versions ultérieures de MySQL (5.7) ont amélioré leur gestion de GROUP BY pour mieux s'aligner sur 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!