Cours SQL et MySQL · Module 6: Agrégations et regroupements

HAVING - filtrer les groupes

2 min de lecture
Dans cette leçon3

Nous savons déjà compter les livres de chaque catégorie. Mais que faire si seules les catégories populaires nous intéressent - celles qui ont plus de trois livres ? Nous ne pouvons pas utiliser WHERE - tu comprendras pourquoi dans un instant. C'est la clause HAVING qui filtre les groupes.

Qu'est-ce que HAVING ?

HAVING filtre des groupes entiers en fonction du résultat d'une fonction d'agrégat - déjà après l'exécution de GROUP BY.

1SELECT kategoria_id, COUNT(*)
2FROM ksiazki
3GROUP BY kategoria_id
4HAVING COUNT(*) > 3;

Cela signifie : « Montre les catégories, mais seulement celles qui ont plus de 3 livres ». MySQL a d'abord réparti les livres en groupes, a compté chacun d'eux, puis a écarté les groupes qui ne remplissaient pas la condition.

HAVING fonctionne sur les agrégats

La caractéristique la plus importante de HAVING : il peut faire référence à des fonctions d'agrégat, ce que WHERE ne peut pas utiliser.

1-- Catégories dont le prix moyen dépasse 50
2SELECT kategoria_id, AVG(cena)
3FROM ksiazki
4GROUP BY kategoria_id
5HAVING AVG(cena) > 50;
1-- Pays dont nous avons au moins 5 auteurs
2SELECT kraj, COUNT(*)
3FROM autorzy
4GROUP BY kraj
5HAVING COUNT(*) >= 5;

Ordre des clauses

Retiens l'ordre : GROUP BY vient toujours avant HAVING :

1SELECT column, COUNT(*)
2FROM table
3GROUP BY column
4HAVING COUNT(*) > number;

HAVING est un tamis à travers lequel nous versons les groupes déjà formés - ne restent que ceux qui sont assez grands, chers ou nombreux.

Tu as repéré une erreur dans cette leçon ?

Teste tes connaissances

Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.

  1. 1. À quoi sert la clause HAVING ?

  2. 2. Dans quel ordre doivent apparaître les clauses GROUP BY et HAVING ?

Voici 2 des 3 questions de cette leçon. Réponds aux autres dans le jeu.

Tâches pratiques dans le jeu

  • Éditeur de code

    Écris une requête qui sélectionne kategoria_id et COUNT(*) dans la table ksiazki, regroupe par kategoria_id, et n'affiche que les groupes ayant plus de 3 livres (HAVING).

  • Tri vertical

    Ordonne les clauses d'une requête de regroupement avec un filtre sur les groupes dans le bon ordre (de haut en bas) :

  • Éditeur de code

    Écris une requête qui sélectionne kategoria_id et AVG(cena) dans la table ksiazki, regroupe par kategoria_id, et ne garde que les groupes où AVG(cena) est supérieur à 50.

  • Éditeur de code

    Écris une requête qui sélectionne kraj et COUNT(*) dans la table autorzy, regroupe par kraj, et ne garde que les groupes ayant au moins 5 auteurs (HAVING COUNT(*) >= 5).