Maison >base de données >tutoriel mysql >Pourquoi la clause GROUP BY de MySQL produit-elle des résultats inattendus sans fonctions d'agrégation ?
Clause GROUP BY
de MySQL : résultats inattendus sans fonctions d'agrégation
La clause GROUP BY
en SQL est essentielle pour l'agrégation des données. Cependant, son comportement lorsqu'il est utilisé sans fonctions d'agrégation (comme SUM
, AVG
, COUNT
, etc.) dans l'instruction SELECT
peut être contre-intuitif, en particulier dans MySQL.
Illustrons cela avec un exemple. Considérons un tableau emp
avec les données des employés :
name | dept | salary |
---|---|---|
Jack | a | 2 |
Jill | a | 1 |
Tom | b | 2 |
Fred | b | 1 |
La requête suivante :
<code class="language-sql">SELECT * FROM emp GROUP BY dept;</code>
pourrait sembler impliquer la récupération de tous les départements distincts. Cependant, le résultat de MySQL est souvent :
name | dept | salary |
---|---|---|
Jill | a | 1 |
Fred | b | 1 |
Pourquoi Jill et Fred, et pas Jack et Tom ?
L'optimisation GROUP BY
de MySQL est la coupable. Sans fonctions d'agrégation, MySQL peut sélectionner des valeurs arbitraires pour les colonnes non incluses dans la clause GROUP BY
. Cette optimisation donne la priorité à la vitesse, en supposant (à tort dans ce cas) que les colonnes non groupées sont cohérentes au sein de chaque groupe.
Les points clés à retenir :
GROUP BY
sans fonctions d'agrégation, le choix des valeurs par MySQL pour ces colonnes est imprévisible.ORDER BY
Ne garantit pas le déterminisme : L'ajout d'une clause ORDER BY
ne rend pas le résultat déterministe dans ce contexte.Cette requête apparemment simple souligne l'importance d'inclure explicitement toutes les colonnes non agrégées dans la clause GROUP BY
pour garantir des résultats prévisibles et fiables. Sinon, vous risquez d'obtenir des données incohérentes et potentiellement trompeuses.
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!