Extension GROUP BY non standard de MySQL : autoriser la sélection de colonnes non groupées
La syntaxe SQL standard interdit la sélection de champs non agrégés qui sont pas explicitement regroupés dans la clause GROUP BY d'une requête agrégée. Cependant, MySQL s'écarte de cette norme en autorisant de telles sélections.
SQL standard par rapport à l'extension de MySQL
Jusqu'en 1992, la spécification SQL standard interdisait ce comportement, garantissant que l'agrégat les requêtes renvoyaient uniquement des valeurs agrégées ou des colonnes regroupées dans la clause GROUP BY.
Cependant, avec la sortie de SQL-2003, la norme a été modifiée pour permettre la sélection de colonnes fonctionnellement dépendantes des colonnes de regroupement. L'extension de MySQL va cependant au-delà de cette norme en permettant de sélectionner toutes les colonnes, quelles que soient leurs dépendances fonctionnelles.
Implications de l'extension de MySQL
Cette extension a plusieurs implications :
Motivation de MySQL pour l'extension
MySQL a implémenté cette extension pour se conformer aux normes SQL-2003, tout en répondant aux problèmes de performances et de maintenabilité mentionnés ci-dessus . Cependant, ils ont choisi une approche simplifiée en permettant la sélection de toutes les colonnes, plutôt que de mettre en œuvre un mécanisme plus complexe pour identifier les colonnes fonctionnellement dépendantes.
Désactivation de l'extension
Si Si vous le souhaitez, les utilisateurs peuvent désactiver l'extension en définissant sql_mode sur ONLY_FULL_GROUP_BY. Cela restaurera le comportement SQL-92 plus strict, garantissant que les colonnes non groupées ne peuvent pas être sélectionnées dans les requêtes agrégées.
Développements récents
En 2011, PostgreSQL a ajouté un plus implémentation restrictive de cette fonctionnalité, plus proche du standard SQL. La gestion de GROUP BY par MySQL a été encore améliorée dans la version 5.7 (2015), incorporant un mécanisme pour reconnaître les dépendances fonctionnelles, l'alignant plus étroitement 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!