Cours SQL et MySQL · Module 6: Agrégations et regroupements
WHERE face à HAVING
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 livresLa différence la plus importante
| WHERE | HAVING | |
|---|---|---|
| Quand il agit | avant le regroupement | après l'agrégation |
| Sur quoi il agit | lignes individuelles | groupes |
| Fonctions d'agrégat | NE PEUT PAS les utiliser | PEUT 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. À quel moment agit la clause WHERE ?
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 :