Blog Navicat

Filtrage des champs agrégés à l'aide de la clause Having Oct 8, 2024 by Robert Gravelle

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 :

top movie renters (89K)

À 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:

top movie renters for first half of 2005 (96K)

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 !

Partager
Archives du blog