Si vous écrivez des requêtes SQL depuis un certain temps, vous connaissez probablement la clause WHERE. Bien qu'elle n'ait aucun effet sur les champs agrégés, il existe un moyen de filtrer les enregistrements en fonction des valeurs agrégées, en utilisant la clause HAVING. Ce blog abordera le fonctionnement de cette clause et fournira quelques exemples de son utilisation dans les requêtes SELECT.
Agrégation et clause HAVING
L'agrégation est généralement utilisée en conjonction avec le regroupement. Dans SQL, cela s'effectue à l'aide de la clause GROUP BY. L'agrégation, associée au regroupement, nous permet d'obtenir des informations de haut niveau sur nos données. Par exemple, une entreprise de commerce électronique peut vouloir suivre ses ventes sur une période donnée.
Dans de nombreux cas, il n'est pas nécessaire d'appliquer la clause GROUP BY à l'ensemble des données. Dans ces cas, nous pouvons utiliser la commande GROUP BY avec la clause conditionnelle HAVING pour filtrer les résultats indésirables. Comme la clause WHERE, HAVING spécifie une ou plusieurs conditions de filtrage, mais pour un groupe ou une agrégation. Par conséquent, HAVING est toujours placé après les clauses WHERE et GROUP BY mais avant la clause ORDER BY (facultative) :
SELECT column_list FROM table_name WHERE where_conditions GROUP BY column_list HAVING having_conditions ORDER BY order_expression
Quelques exemples pratiques
Pour avoir une meilleure idée du fonctionnement de HAVING, exécutons quelques requêtes SELECT sur la base de données d'exemples Sakila.
Notre première requête dresse la liste des principaux loueurs de films, triés par ordre décroissant, de sorte que la personne ayant effectué le plus grand nombre de locations apparaisse en tête de liste. Nous utiliserons la clause HAVING pour supprimer les clients ayant effectué moins de trois locations afin de raccourcir quelque peu la liste :
SELECT c.customer_id, c.first_name, c.last_name, COUNT(r.rental_id) AS total_rentals FROM customer AS c LEFT JOIN rental AS r ON c.customer_id = r.customer_id GROUP BY c.customer_id HAVING total_rentals >= 3 ORDER BY total_rentals DESC;
Voici la requête et la première page de résultats dans Navicat Premium :
À en juger par ces chiffres de location, nous aurions pu réduire considérablement la liste !
Filtrage des lignes à l'aide de WHERE et HAVING
Tout comme GROUP BY et ORDER BY sont appliqués à différents moments du processus de requête, WHERE et HAVING le sont également. Par conséquent, nous pouvons inclure les deux pour filtrer les résultats avant et après le regroupement et l'agrégation. Par exemple, nous pouvons ajouter une clause WHERE pour limiter les résultats au premier semestre d'une année donnée :
SELECT c.customer_id, c.first_name, c.last_name, COUNT(r.rental_id) AS total_rentals FROM customer AS c LEFT JOIN rental AS r ON c.customer_id = r.customer_id WHERE r.rental_date BETWEEN '2005-01-01' AND '2005-06-30' GROUP BY c.customer_id HAVING total_rentals >= 3 ORDER BY total_rentals DESC;
Voici à nouveau la requête ci-dessus et la première page de résultats dans Navicat Premium:
Combinaison de plusieurs conditions
Tout comme la clause WHERE prend en charge plusieurs conditions à l'aide des mots-clés AND et OR, la clause HAVING le fait également. Par exemple, nous pouvons rechercher les clients dont les nombres de location se situent dans une fourchette donnée en modifiant la clause HAVING de la manière suivante :
HAVING total_rentals >= 3 AND total_rentals <= 10
Conclusion
Dans le blog d'aujourd'hui, nous avons appris à filtrer les champs groupés et agrégés en utilisant la clause HAVING.
Navicat Premium Vous pouvez l'essayer gratuitement pendant 14 jours à des fins d'évaluation !