GROUP BY et HAVING

Regrouper les lignes et calculer un agrégat par groupe avec GROUP BY, filtrer les groupes avec HAVING plutôt que WHERE, et connaître l'ordre dans lequel la base évalue les clauses.

  • 18 cartes
  • 4 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Les chiffres

Quelques cartes du deck

  • GROUP BY : de quoi s'agit-il ?

    Voir la réponse

    Clause qui range les lignes en groupes de valeurs identiques, pour qu'un agrégat soit calculé une fois par groupe.

    Le résultat compte une ligne par groupe. Dans SELECT, on ne met que les colonnes du regroupement et des agrégats.

  • Quelles lignes rend cette requête ?

    ```sql
    -- client : Durand Lyon | Martin Paris | Bassam Lyon | Dao Lille
    -- Leroy Paris | Rossi Milan | Conti Milan | Weber Berlin | Keller Lyon
    SELECT ville, COUNT(*)
    FROM client
    GROUP BY ville
    HAVING COUNT(*) >= 2;
    `

    • Lyon 3, Milan 2, Paris 2
    • Lyon 3
    • Berlin 1, Lille 1, Lyon 3, Milan 2, Paris 2
    • Lyon 3, Paris 2
    Voir la réponse

    Lyon 3, Milan 2, Paris 2

    Les groupes sont Berlin 1, Lille 1, Lyon 3, Milan 2, Paris 2. HAVING écarte Berlin et Lille, qui n'ont qu'un client. Le seuil est « au moins 2 », donc Milan et Paris restent.

  • Pour obtenir une ligne par ville avec le nombre de clients de chacune, on termine SELECT ville, COUNT(*) FROM client par ….

    Voir la réponse

    Pour obtenir une ligne par ville avec le nombre de clients de chacune, on termine SELECT ville, COUNT(*) FROM client par GROUP BY ville.

    Chaque ville forme un groupe et COUNT(*) compte les lignes de ce groupe. Sans GROUP BY, la requête échoue : ville n'est pas agrégée.

  • HAVING : de quoi s'agit-il ?

    Voir la réponse

    Clause qui filtre les groupes après le regroupement, en général selon la valeur d'un agrégat.

    HAVING COUNT(*) >= 2 garde les groupes d'au moins deux lignes. Un groupe écarté disparaît entièrement du résultat.