Maison >base de données >tutoriel mysql >Pourquoi une clause « GROUP BY » fonctionne-t-elle différemment dans MySQL et PostgreSQL ?

Pourquoi une clause « GROUP BY » fonctionne-t-elle différemment dans MySQL et PostgreSQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-18 09:41:10524parcourir

Why Does a `GROUP BY` Clause Work Differently in MySQL and PostgreSQL?

MySQL et PostgreSQL GROUP BY Clause : une comparaison

MySQL et PostgreSQL, systèmes de bases de données relationnelles populaires, gèrent la clause GROUP BY différemment. Cette clause regroupe les lignes en fonction de colonnes spécifiées, permettant ainsi les calculs de fonctions d'agrégation sur des données groupées. Examinons les principales différences.

Un scénario courant implique un tableau (par exemple, the_table) avec des colonnes col1, col2 et col3. Dans MySQL, une requête comme SELECT col2, col3, col1 FROM the_table GROUP BY col2; peut renvoyer des résultats, sélectionnant apparemment des valeurs arbitraires pour col3 et col1 au sein de chaque groupe col2. Cependant, la même requête dans PostgreSQL produit une erreur.

Pourquoi l'erreur PostgreSQL ?

PostgreSQL adhère strictement au standard SQL. La norme exige que toute colonne de la liste SELECT non incluse dans la clause GROUP BY doive faire partie d'une fonction d'agrégation. Dans notre exemple, col3 et col1 enfreignent cette règle.

Fonctions agrégées expliquées

Les fonctions d'agrégation (comme MIN, MAX, AVG, SUM, COUNT) calculent une valeur unique à partir de plusieurs lignes. Ils sont indispensables pour synthétiser des données groupées.

Comportement non standard de MySQL

Le comportement de MySQL s'écarte du standard. Il permet de sélectionner des colonnes non agrégées ne figurant pas dans la clause GROUP BY, mais ce n'est pas fiable. Les valeurs sélectionnées pour ces colonnes sont imprévisibles et dépendent du fonctionnement interne de la base de données ; leur cohérence n'est pas garantie.

Requêtes conformes aux normes

Pour garantir des résultats cohérents et prévisibles dans les deux bases de données, utilisez toujours des fonctions d'agrégation pour les colonnes non présentes dans la clause GROUP BY. La requête suivante fonctionne correctement dans MySQL et PostgreSQL :

<code class="language-sql">SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table
GROUP BY col2;</code>

Cette requête utilise MIN() pour trouver la valeur minimale de col3 et col1 pour chaque col2 groupe, fournissant des résultats bien définis. Le remplacement de MIN() par d'autres fonctions d'agrégation telles que MAX(), AVG(), etc. fournit des statistiques récapitulatives différentes pour chaque groupe. Cette approche garantit la conformité au standard SQL et évite l'ambiguïté inhérente à l'extension GROUP BY non standard de MySQL.

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!

Déclaration:
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