Leçon 7 / 10 — Chapitre 6: GROUP BY et HAVING
HAVING contre WHERE
WHERE et HAVING filtrent tous deux des lignes, mais à des moments différents du traitement d'une requête — une confusion fréquente à ne jamais commettre.
| | WHERE | HAVING |
|---|---|---|
| Filtre quoi | Des lignes individuelles | Des groupes déjà formés |
| S'exécute | Avant GROUP BY | Après GROUP BY |
| Référence une agrégation | Jamais | Oui, directement |
SELECT categorie, COUNT(*)
FROM produits
WHERE prix > 100
GROUP BY categorie
HAVING COUNT(*) > 1;
Ce que fait chaque partie, dans l'ordre réel d'exécution :
WHERE prix > 100exclutStylo(100 $ exactement, non strictement supérieur), avant tout regroupement.GROUP BY categorieregroupe les lignes restantes par catégorie.HAVING COUNT(*) > 1ne garde que les groupes ayant plus d'une ligne, après le regroupement.
Sur les 5 lignes restantes après WHERE : papeterie (Cahier seul, Stylo exclu) → 1, exclu par HAVING. hygiene → 2, conservé. boisson → 1, exclu. alimentaire → 1, exclu. Seule hygiene apparaît dans le résultat final.
À retenir :
WHEREfiltre des lignes avant le regroupement ;HAVINGfiltre des groupes après le regroupement.- Utiliser
WHEREdès que possible reste préférable : il élimine des lignes plus tôt, avant même que l'agrégation ne les traite.
À vous de jouer : modifiez la requête de cette leçon pour garder les groupes ayant au moins 1 produit, et déterminez si le résultat change.
Continuez ce module
Débloquez les leçons restantes ainsi que la certification finale.
2 500 XOF / 3,81 € / 4,15 $
Débloquez les 84 leçons restantes de ce module
Votre paiement est vérifié avant l'activation de l'accès