Maison > base de données > tutoriel mysql > Pourquoi le comportement « GROUP BY » de MySQL est-il imprévisible sans fonctions d'agrégation ?

Pourquoi le comportement « GROUP BY » de MySQL est-il imprévisible sans fonctions d'agrégation ?

Susan Sarandon
Libérer: 2025-01-08 07:33:41
original
562 Les gens l'ont consulté

Why is MySQL's `GROUP BY` behavior unpredictable without aggregate functions?

Le comportement de la clause GROUP BY en SQL sans fonction d'agrégation

Lors de l'exécution d'une requête GROUP BY sans utiliser de fonctions d'agrégation, la sélection de lignes renvoyée par MySQL n'est pas explicite. Comprendre son comportement sous-jacent est essentiel pour déboguer de tels scénarios et garantir la fiabilité des résultats des requêtes.

Par exemple, pour la requête SELECT * FROM emp GROUP BY dept, le serveur choisit de renvoyer Jill et Fred au lieu de Jack et Tom. Cela est dû à une technique d'optimisation utilisée par MySQL. Cependant, cette optimisation n'est fiable que si les colonnes omises (nom et salaire dans ce cas) ont la même valeur au sein de chaque groupe (par exemple, Jill et Tom ont le même nom et le même salaire dans le groupe 'a', Fred et Tom ont le même nom et salaire dans le groupe 'b').

Si la colonne omise a des valeurs différentes au sein du groupe, la sélection n'est pas définie, ce qui signifie que le serveur peut renvoyer n'importe quelle ligne du groupe. Ce comportement est clairement indiqué dans la documentation MySQL :

<code>使用此功能时,每个组中的所有行对于从 GROUP BY 部分省略的列都应具有相同的值。服务器可以自由返回组中的任何值,因此除非所有值都相同,否则结果是不确定的。</code>
Copier après la connexion

Ce comportement provoque des problèmes lors de l'utilisation de * dans une clause SELECT au lieu d'une énumération de colonne explicite. Dans l'exemple fourni, la requête SELECT A.*, MIN(A.salary) AS min_salary FROM emp AS A GROUP BY A.dept peut ne pas toujours renvoyer la ligne de salaire la plus basse pour chaque département si la colonne omise a des valeurs différentes au sein du groupe.

Pour éviter des résultats indéterminés, il est fortement recommandé de spécifier explicitement les colonnes requises dans la clause SELECT, en garantissant que les colonnes omises ont la même valeur au sein de chaque groupe. Des requêtes comme SELECT A.* FROM emp AS A WHERE A.salary = (SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept) doivent être utilisées au lieu de s'appuyer sur un comportement indéfini.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal