Maison >base de données >tutoriel mysql >Le comportement GROUP BY non standard de MySQL viole-t-il les normes SQL ?
Introduction
L'extension MySQL au GROUP BY La clause, permettant la sélection de colonnes non incluses dans le regroupement, a soulevé des questions quant au respect des normes SQL. Cet article explore le contexte historique et les implications de cet écart.
La norme
Avant SQL-2003, il était courant d'interdire la sélection de données non agrégées. colonnes qui ne faisaient pas partie de la clause GROUP BY. Cette restriction garantissait des résultats cohérents en éliminant les regroupements ambigus.
Extension de MySQL
MySQL a introduit une extension qui permet de sélectionner des colonnes non agrégées même lorsqu'elles ne font pas partie de le GROUPE PAR. Selon la documentation MySQL, cela vise à optimiser les performances en évitant les tris et regroupements inutiles. Cependant, il comporte une mise en garde : les valeurs non agrégées peuvent être indéterminées, ce qui signifie que le serveur peut choisir n'importe quelle valeur dans chaque groupe.
Interprétation SQL standard
Le La norme SQL-2003 autorise les références de colonnes non agrégées dans la liste de sélection si elles dépendent fonctionnellement des colonnes de regroupement ou si elles sont contenues dans un argument agrégé. La dépendance fonctionnelle garantit que pour chaque valeur des colonnes de regroupement, il existe une seule valeur unique pour les colonnes non agrégées.
Implémentation de MySQL
L'extension de MySQL s'écarte de la standard en permettant de sélectionner toutes les colonnes, même celles qui ne dépendent pas fonctionnellement des colonnes de regroupement. Cela peut conduire à des résultats inattendus lorsque les valeurs non agrégées varient au sein des groupes.
Conséquences de l'extension de MySQL
La mise en œuvre de MySQL a deux implications principales :
Résoudre la déviation de MySQL
Les utilisateurs de MySQL peuvent désactiver le comportement non standard en définissant sql_mode sur ONLY_FULL_GROUP_BY. De plus, des améliorations ont été introduites dans MySQL 5.7 pour mieux se conformer au standard. PostgreSQL 9.1 propose également une implémentation plus restrictive qui respecte étroitement les exigences de dépendance fonctionnelle.
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!