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 ?

Pourquoi la clause GROUP BY de MySQL produit-elle des résultats inattendus sans fonctions d'agrégation ?

DDD
Libérer: 2025-01-08 07:47:09
original
857 Les gens l'ont consulté

Why Does MySQL's GROUP BY Clause Produce Unexpected Results Without Aggregate Functions?

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>
Copier après la connexion

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 :

  • Résultats indéterminés : Lors de l'omission de colonnes de la clause GROUP BY sans fonctions d'agrégation, le choix des valeurs par MySQL pour ces colonnes est imprévisible.
  • Résultats déterministes (rares) : Le résultat n'est garanti déterministe que si les colonnes omises ont des valeurs identiques au sein de chaque groupe. C'est rarement le cas dans les scénarios du monde réel.
  • 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal