Formation PUB200 : MySQL, 2018 Options pour préciser un SELECT

9.6 Regrouper les enregistrements : GROUP BY


La clause GROUP BY permet de regrouper les enregistrements qui répondent à une condition. Chaque ligne du résultat de la requête sera donc calculée à partir de plusieurs enregistrements.

Ex : La requête suivante permet d'afficher le prix total de chaque réparation puisqu'une réparation peut comporter plusieurs lignes de détails.

MySQL

SELECT id, SUM(prix) AS total

FROM lignesfactures 

GROUP BY facture_id;

GROUP BY appliqué à une clé étrangère

Théoriquement, il est possible d'appliquer la clause GROUP BY sur n'importe quel champ. Dans la pratique, cependant, on fera presque toujours un GROUP BY sur une clé étrangère. 

Ex : Cette requête permet de compter le nombre de voitures pour chacun des modèles. Remarquez que le GROUP BY est appliqué sur la clé étrangère modele_id.

MySQL

SELECT modele_id, COUNT(*) as nombre_voitures

FROM voitures

GROUP BY modele_id;

GROUP BY appliqué à une information unique

Lorsqu'une requête travaille sur deux tables liées par un INNER JOIN, il faut faire attention au champ employé dans le GROUP BY. Dans l'exemple du nombre de voitures par modèle, il pourrait être tentant de regrouper les enregistrements sur le nom de modèle plutôt que sur l'identifiant. 

Ex : 

MySQL

SELECT nom, COUNT(*) as nombre_voitures

FROM voitures

INNER JOIN modeles ON modele_id = modeles.id

GROUP BY nom;

Puisque, dans la base de données, rien n'empêche d'entrer deux modèles qui portent le même nom (il n'y a pas d'index unique), la requête pourrait ne pas donner de bons résultats.

On devrait plutôt appliquer le GROUP BY sur le champ modele_id puisqu'il s'agit d'une information unique dans la table contenant la clé primaire. 

Notez que puisque modeles.id et voitures.modele_id sont les champs utilisés dans la jointure, on aurait obtenu les mêmes résultats en faisant le GROUP BY sur l'un ou sur l'autre.

MySQL

SELECT modeles.id, nom, COUNT(*) as nombre_voitures

FROM voitures

INNER JOIN modeles ON modele_id = modeles.id

GROUP BY modele_id; 

Quelles informations peuvent être affichées à l'aide d'une requête utilisant GROUP BY ?

Pour qu'une requête utilisant la clause GROUP BY soit valide, il faut que chaque colonne affichée soit :

  • le champ mentionné dans la clause GROUP BY

    ou

  • une colonne qui utilise une fonction d’agrégation (COUNT, SUM, AVG, MAX ou MIN)

    ou

  • dans le cas où la requête contient une clause INNER JOIN et que le GROUP BY est appliqué à une clé étrangère, une des colonnes de la table contenant la clé primaire.

Ex :

MySQL

SELECT mecanicien_id, nomfamille, COUNT(*) AS nombre_factures

FROM factures

INNER JOIN mecaniciens ON mecanicien_id = mecaniciens.id

GROUP BY mecanicien_id

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre