L3 Info : SGBD
 
◃  Ch. 10 SQL : DQL (Algèbre relationnel et SQL)  ▹
 

La clause GROUP BY

  • La clause GROUP BY regroupe les données qui ont la même valeur sur une ou plusieurs colonnes.
  • Ces regroupements permettent de spécialiser l'usage des fonctions d'agrégation sur les catégories ainsi formées.
  • Attention ! Toute colonne sélectionnée et non agrégée doit figurer dans la clause GROUP BY. Certains SGBD acceptent de simplifier la clause GROUP BY avec la clé primaire associée aux colonnes non agrégées.
  • Exemple :
    SELECT * FROM etudiant;
     etud_num | etud_nom | etud_prenom |       etud_adresse        | etud_naissance | dip_id 
    ----------+----------+-------------+---------------------------+----------------+--------
     20000001 | Martin   | Jacques     | Résidence de la pommeraie | 1995-01-01     |      1
     20000002 | Martin   | Pierre      | Résidence de la pommeraie | 1995-10-21     |      1
     20000003 | Dalton   | Joe         | Pénitencier fédéral       | 1865-04-01     |       
     20000004 | Dalton   | Jack        | Pénitencier fédéral       | 1866-07-04     |       
     20000005 | Dalton   | William     | Pénitencier fédéral       | 1867-11-28     |       
     20000006 | Dalton   | Averell     | Pénitencier fédéral       | 1868-12-25     |       
    (6 rows)
    
    SELECT COUNT(*), etud_nom FROM etudiant GROUP BY etud_nom;
     count | etud_nom 
    -------+----------
         4 | Dalton
         2 | Martin
    (2 rows)
  • La requête SELECT col1, aggrégation(col2) FROM R GROUP BY col1 est exécutée suivant l'algorithme suivant :
      ENTRÉE : une relation R(col1, col2, ...)
      SORTIE : une relation S(col1, valAggrégée)
      VARIABLE
        catégorie[] un tableau de données de même type que col1;
        valAggrégée une valeur issue de la fonction aggrégation;
        cat une valeur de catégorie[];
      DÉBUT
        S := ∅
        catégorie[] := SELECT DISTINCT col1 FROM R;
        POUR CHAQUE cat DANS catégorie[] FAIRE
          valAggrégée := SELECT aggrégation(col2) FROM R WHERE col1=cat;
          S := S ∪ (cat, valAggrégée);
        FIN POUR
        RETOURNER S;
      FIN