Maison > base de données > tutoriel mysql > Pourquoi MySQL autorise-t-il la sélection de colonnes ne figurant pas dans la clause GROUP BY ?

Pourquoi MySQL autorise-t-il la sélection de colonnes ne figurant pas dans la clause GROUP BY ?

Susan Sarandon
Libérer: 2024-12-23 08:40:17
original
373 Les gens l'ont consulté

Why Does MySQL Allow Selecting Columns Not in the GROUP BY Clause?

Sélection de colonnes non incluses dans la clause GROUP BY : comportement ambigu de MySQL

Dans MySQL, il est possible de sélectionner une colonne non incluse dans une fonction d'agrégation ou dans le GROUP BY clause, ce qui peut prêter à confusion pour les programmeurs provenant d'autres bases de données SQL. Ce comportement s'écarte de la norme ANSI SQL, qui exige que toutes les colonnes sélectionnées fassent partie du regroupement ou apparaissent dans une fonction d'agrégation.

Requêtes ambiguës et sélection de valeurs arbitraires

Lorsque MySQL rencontre une telle requête, il renvoie silencieusement une valeur arbitraire de la colonne de chaque groupe, généralement la valeur de la première ou de la dernière ligne du groupe. Ce comportement peut conduire à des résultats ambigus, surtout si les valeurs de la colonne non groupée ne sont pas cohérentes au sein de chaque groupe.

Exemple de requête

Considérez la requête MySQL suivante :

SELECT
     AVG(table_name.col1),
     AVG(table_name.col2),
     AVG(table_name.col3),
     table_name.personID,
     table_name.col4
FROM table_name
GROUP BY table_name.personID;
Copier après la connexion

Dans cette requête, col4 ne fait pas partie de la clause GROUP BY ni d'une fonction d'agrégation. MySQL sélectionnera arbitrairement une valeur pour col4 pour chaque groupe. Cela peut être problématique si différentes lignes au sein d'un groupe ont des valeurs différentes pour col4.

Dépendance fonctionnelle et résultats déterministes

MySQL permet de sélectionner des colonnes non groupées lorsqu'elles sont fonctionnellement dépend de la ou des colonnes de la clause GROUP BY. Cela signifie que pour chaque valeur de la ou des colonnes de regroupement, il n'y a qu'une seule valeur possible pour la colonne non groupée. Dans de tels cas, la requête renverra un résultat déterministe.

Cependant, il est important de noter que le comportement de MySQL avec des requêtes ambiguës peut changer dans les versions futures. Par conséquent, il est recommandé d'éviter d'utiliser des colonnes non groupées dans les clauses SELECT à moins qu'elles ne soient explicitement incluses dans la clause GROUP BY ou dans une fonction d'agrégation.

Mode SQL "ONLY_FULL_GROUP_BY"

MySQL 5.7 a introduit le mode SQL "ONLY_FULL_GROUP_BY", qui applique la norme ANSI SQL pour GROUP BY requêtes. Lorsque ce mode est activé, la sélection de colonnes non groupées sans fonction d'agrégation entraînera une erreur.

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