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
.HAVING
est 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 BY
pour améliorer les performances. - Filtre précoce avec
WHERE
. Utilisez la clauseWHERE
pour filtrer les lignes avant l'agrégation pour plus d'efficacité. - Évitez le surmenage. Utilisez
HAVING
avec parcimonie, car le filtrage des résultats agrégés peut être gourmand en ressources.