PostgreSQL HAVING
La clause HAVING de PostgreSQL est utilisée pour filtrer les enregistrements qui fonctionnent avec des fonctions agrégées. Elle vous permet de spécifier des conditions sur les groupes créés par la clause GROUP BY.
Utilisation
La clause HAVING est utilisée lorsque vous devez filtrer des groupes de données en conjonction avec des fonctions d'agrégation telles que SUM, COUNT ou AVG. Elle vient après la clause GROUP BY et avant ORDER BY si elle est utilisée.
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
Dans cette syntaxe, HAVING condition filtre les résultats renvoyés par la clause GROUP BY sur la base des résultats de la fonction d'agrégation. Alors que WHERE filtre les lignes avant l'agrégation, HAVING applique des conditions après l'agrégation.
Exemples
1. Filtre de base pour les groupes
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 10;
Cette requête liste les départements ayant plus de 10 employés en filtrant les groupes créés par la clause GROUP BY.
2. Utilisation de SUM avec HAVING
SELECT product_id, SUM(quantity)
FROM sales
GROUP BY product_id
HAVING SUM(quantity) > 100;
Ici, la requête permet de retrouver les produits qui ont été vendus à plus de 100 unités en filtrant sur la base de la somme des quantités.
3. Condition complexe avec plusieurs agrégats
SELECT manager_id, COUNT(employee_id), AVG(salary)
FROM employees
GROUP BY manager_id
HAVING COUNT(employee_id) > 5 AND AVG(salary) < 70000;
Cet exemple filtre les managers qui supervisent plus de cinq employés et dont le salaire moyen est inférieur à 70 000 dollars.
4. HAVING Sans GROUP BY
SELECT SUM(quantity)
FROM sales
HAVING SUM(quantity) > 1000;
Cet exemple illustre l'utilisation de HAVING sans GROUP BY, en filtrant l'ensemble des données pour déterminer si la quantité totale est supérieure à 1000 unités.
Conseils et bonnes pratiques
- Utilisation avec
GROUP BY.HAVINGest conçu pour fonctionner avecGROUP BY; assurez-vous que votre requête regroupe les données de manière appropriée, bien qu'il puisse également être utilisé sans lui pour l'agrégation de l'ensemble des données. - Optimisez avec des index. Envisagez d'indexer les colonnes utilisées dans la clause
GROUP BYpour améliorer les performances. - Filtre précoce avec
WHERE. Utilisez la clauseWHEREpour filtrer les lignes avant l'agrégation pour plus d'efficacité. - Évitez le surmenage. Utilisez
HAVINGavec parcimonie, car le filtrage des résultats agrégés peut être gourmand en ressources.