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

WHERE face à HAVING

2 min de lecture
Dans cette leçon4

Cette question trouble bien des scribes : quand utiliser WHERE, et quand utiliser HAVING ? Les deux filtrent des données, mais à un moment complètement différent et à un niveau différent. Résolvons cette énigme une fois pour toutes.

WHERE filtre les lignes - AVANT le regroupement

WHERE agit sur les lignes individuelles, avant que quoi que ce soit ne soit regroupé. Il écarte les parchemins qui ne remplissent pas la condition :

1SELECT kategoria_id, COUNT(*)
2FROM ksiazki
3WHERE dostepna = 1          -- écarter d'abord les livres indisponibles
4GROUP BY kategoria_id;

Ici, MySQL d'abord rejette tous les livres indisponibles, et seulement ensuite regroupe et compte ceux qui restent.

HAVING filtre les groupes - APRÈS l'agrégation

HAVING agit sur les groupes déjà formés, après le calcul des agrégats. Il écarte des groupes entiers qui ne remplissent pas la condition :

1SELECT kategoria_id, COUNT(*)
2FROM ksiazki
3GROUP BY kategoria_id
4HAVING COUNT(*) > 3;        -- écarter les groupes de moins de 4 livres

La différence la plus importante

WHEREHAVING
Quand il agitavant le regroupementaprès l'agrégation
Sur quoi il agitlignes individuellesgroupes
Fonctions d'agrégatNE PEUT PAS les utiliserPEUT les utiliser

Règle pratique : si la condition concerne une colonne ordinaire (dostepna = 1, rok_wydania > 2000) - utilise WHERE. Si la condition concerne le résultat d'une agrégation (COUNT(*) > 3, AVG(cena) > 50) - utilise HAVING.

Les deux à la fois

Nous les utilisons souvent ensemble - WHERE réduit les données, HAVING sélectionne les groupes :

1SELECT kategoria_id, AVG(cena)
2FROM ksiazki
3WHERE dostepna = 1
4GROUP BY kategoria_id
5HAVING AVG(cena) > 40
6ORDER BY AVG(cena) DESC;

C'est le chant complet de l'agrégation : filtrer les lignes, regrouper, filtrer les groupes, trier. Une commande magistrale !

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. À quel moment agit la clause WHERE ?

  2. 2. La condition concerne une colonne ordinaire : dostepna = 1. Quelle clause dois-tu utiliser ?

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, ne prend en compte que les lignes où dostepna = 1, et regroupe le résultat par kategoria_id.

  • Tri horizontal

    Ordonne les éléments sur une seule ligne pour former une clause qui filtre les livres disponibles :

  • Tri horizontal

    Ordonne les éléments sur une seule ligne pour former une clause qui filtre les livres publiés après l'année 2000 :

  • Clique dans l'ordre

    Clique sur les clauses dans le bon ordre où elles doivent apparaître dans une requête d'agrégation avec un filtre et un tri :