Lorsque vous travaillez avec des données groupées en SQL, vous devez souvent filtrer les résultats de l'agrégation. La clause HAVING permet de spécifier des conditions sur les groupes créés par GROUP BY, de la même façon que WHERE filtre les lignes individuelles. Dans cette leçon, vous apprendrez à utiliser HAVING pour filtrer les résultats agrégés, avec des exemples pratiques sur la base Sakila.
WHERE filtre les lignes avant le regroupement.HAVING filtre les groupes après l'agrégation.SELECT colonne1, FONCTION_AGG(colonne2)
FROM table
GROUP BY colonne1
HAVING condition;
SELECT customer_id, SUM(amount) AS total_paye
FROM payment
GROUP BY customer_id
HAVING SUM(amount) > 100;
Résultat : Retourne uniquement les clients dont le total des paiements dépasse 100.
SELECT staff_id, COUNT(*) AS nb_paiements
FROM payment
GROUP BY staff_id
HAVING COUNT(*) > 50;
Résultat : Affiche seulement les employés ayant traité plus de 50 paiements.
SELECT customer_id, AVG(amount) AS paiement_moyen
FROM payment
GROUP BY customer_id
HAVING AVG(amount) >= 5;
Résultat : Liste les clients dont le paiement moyen est d'au moins 5.
Vous pouvez combiner plusieurs conditions dans la clause HAVING avec AND/OR.
SELECT staff_id, COUNT(*) AS nb_paiements, SUM(amount) AS total_paye
FROM payment
GROUP BY staff_id
HAVING COUNT(*) > 50 AND SUM(amount) > 500;
Résultat : Retourne les employés ayant traité plus de 50 paiements et dont le total dépasse 500.
SELECT c.name AS categorie, SUM(p.amount) AS ventes_totales
FROM payment p
JOIN rental r ON p.rental_id = r.rental_id
JOIN inventory i ON r.inventory_id = i.inventory_id
JOIN film f ON i.film_id = f.film_id
JOIN film_category fc ON f.film_id = fc.film_id
JOIN category c ON fc.category_id = c.category_id
GROUP BY c.name
HAVING SUM(p.amount) > 500;
SELECT country, COUNT(*) AS nb_clients
FROM customer cu
JOIN address a ON cu.address_id = a.address_id
JOIN city ci ON a.city_id = ci.city_id
JOIN country co ON ci.country_id = co.country_id
GROUP BY country
HAVING COUNT(*) > 20;
La clause HAVING permet de filtrer les groupes après l'agrégation, là où WHERE ne peut pas intervenir. Elle est indispensable pour affiner les résultats groupés et obtenir des analyses précises. Pratiquez HAVING avec la base Sakila pour maîtriser le filtrage des données agrégées.