Clause HAVING de MySQL
La clause `HAVING` de MySQL est utilisée pour filtrer les enregistrements qui travaillent sur des données agrégées retournées par `GROUP BY`. Il vous permet de spécifier des conditions qui déterminent quels résultats de groupe sont inclus dans le résultat.
Utilisation
La clause `HAVING` est appliquée après `GROUP BY` pour filtrer les données basées sur des fonctions d'agrégation comme `SUM`, `COUNT`, ou `AVG`. Contrairement à la clause `WHERE`, qui ne peut pas opérer sur des données agrégées et qui est utilisée pour le filtrage au niveau des lignes, `HAVING` est spécifiquement conçue pour les conditions basées sur les agrégats.
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
Dans cette syntaxe, `HAVING condition` spécifie la condition basée sur l'agrégat pour filtrer les résultats groupés.
Note : Dans l'ordre d'exécution des clauses SQL, `HAVING` est traité après `GROUP BY` et avant `ORDER BY`.
Exemples
1. Utilisation de base de l'option HAVING
SELECT department, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department
HAVING num_employees > 5;
Cet exemple permet d'extraire les départements comptant plus de cinq employés en utilisant `HAVING` pour filtrer le résultat agrégé.
2. Utilisation de HAVING avec SUM
SELECT customer_id, SUM(order_total) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 1000;
Ici, la clause `HAVING` filtre les clients qui ont dépensé plus de 1000 $ au total.
3. Conditions multiples dans HAVING
SELECT product_category, AVG(price) AS avg_price
FROM products
GROUP BY product_category
HAVING avg_price BETWEEN 100 AND 500 AND COUNT(product_id) > 10;
Cet exemple utilise plusieurs conditions dans `HAVING` pour trouver les catégories de produits dont le prix moyen est compris entre 100 et 500 $ et qui contiennent plus de dix produits.
4. Utilisation de HAVING avec ORDER BY
SELECT department, COUNT(employee_id) AS num_employees
FROM employees
GROUP BY department
HAVING num_employees > 5
ORDER BY num_employees DESC;
Cet exemple illustre l'utilisation de `ORDER BY` avec `HAVING`, pour trier les résultats des départements ayant plus de cinq employés dans l'ordre décroissant du nombre d'employés.
Conseils et bonnes pratiques
- Utilisez `HAVING` pour un filtrage agrégé. Appliquez `HAVING` lorsque vous filtrez des résultats basés sur des données agrégées, et non pour le filtrage au niveau des lignes.
- Combinez avec `GROUP BY`. Utilisez toujours `HAVING` avec `GROUP BY` car `HAVING` opère sur des données groupées.
- Optimisez avec des index. Garantissez une exécution efficace des requêtes en utilisant des index sur les colonnes impliquées dans `GROUP BY`.
- Limiter les conditions complexes. Gardez les conditions `HAVING` simples pour maintenir la performance et la lisibilité.