Retour à la liste des articles Articles
6 minutes de lecture

Qu'est-ce que la clause HAVING en SQL ?

Vous apprenez le SQL ? Vous vous demandez à quoi peut servir la clause clause HAVING ? Ou, peut-être, avez-vous essayé d'utiliser WHERE sur vos agrégats agrégats GROUP BY ? Vous êtes au bon endroit ! Dans cet article, nous vous expliquons comment utiliser HAVING avec de nombreux exemples.

Avez-vous essayé de filtrer vos métriques que vous avez créées avec GROUP BY avec une clause WHERE et découvert que cela ne fonctionnait pas ? C'est parce que ce n'est pas ce que fait WHERE. Vous avez besoin d'une clause HAVING!

Dans cet article, nous allons vous expliquer comment utiliser HAVING pour filtrer vos données agrégées. Vous apprendrez quand et comment l'utiliser, quelle est sa syntaxe et quelle est la différence avec WHERE. Nous vous montrerons tout cela à l'aide d'exemples détaillés provenant d'une société de location de films.

Vous êtes prêts ? C'est parti !

L'ensemble de données et le problème

Dans cet article, nous utilisons la table film de l'ensemble de données d'échantillon Sakila. Elle contient une liste de films que vous pouvez louer auprès d'un service fictif de location de DVD.

Voici un exemple de requête et son résultat.

SELECT
	title,
	release_year,
	language_id,
	rental_duration,
	length,
	rating
FROM
	film
LIMIT 10;
titlerelease_yearlanguage_idrental_durationlengthrating
ACADEMY DINOSAUR20061686PG
ACE GOLDFINGER20061348G
ADAPTATION HOLES20061750NC-17
AFFAIR PREJUDICE200615117G
AFRICAN EGG200616130G
AGENT TRUMAN200613169PG
AIRPLANE SIERRA20061662PG-13
AIRPORT POLLOCK20061654R
ALABAMA DEVIL200613114PG-13
ALADDIN CALENDAR20061663NC-17

Avec ces données, nous voulons voir quels types de films les gens louent pour des périodes plus ou moins longues. Ces informations nous permettront d'identifier le type de films et de publics sur lesquels nous pourrions nous concentrer.

GROUP BY : Un résumé

Nous utilisons HAVING sur les groupes créés avec une clause GROUP BY.

Rappelons rapidement comment nous agrégeons les données avec GROUP BY. Nous utilisons GROUP BY pour résumer nos données en métriques agrégées. Nous avons besoin de deux choses pour cela :

  • Une fonction d'agrégation comme COUNT, MAX, ou AVG.
  • Une colonne sur laquelle effectuer l'agrégation.

Par exemple, nous voulons savoir combien de films nous avons dans chaque catégorie de classement. Pour répondre à cette question, nous utilisons COUNT(*) pour compter le nombre de films dans chaque groupe, et nous utilisons GROUP BY pour agréger cette métrique en fonction des valeurs de la colonne rating:

SELECT
	rating,
	COUNT(*) AS films
FROM
	film
GROUP BY rating
ORDER BY rating;
ratingfilms
G178
PG194
PG-13223
R195
NC-17210

Le résultat montre le nombre de films par classement. La distribution des films par classement est relativement homogène. Le classement le plus populaire est PG-13, tandis que le moins populaire est G.

Pour en savoir plus sur GROUP BY, consultez cet article détaillé ou cette liste d'exemples pratiques.

Maintenant que nous avons examiné ce qu'est GROUP BY, nous pouvons le combiner avec HAVING !

Quand utiliser les HAVING SQL

La principale utilisation de l'opération HAVING est de filtrer des données agrégées. Vous pouvez l'utiliser lorsque vous résumez vos données avec GROUP BY en de nouvelles valeurs métriques, et que vous voulez sélectionner les résultats en fonction de ces nouvelles valeurs.

Elle est similaire à WHERE, mais vous les utilisez dans des circonstances différentes. À la fin de cet article, vous découvrirez cette différence en détail.

La syntaxe SQL HAVING

En termes de syntaxe, HAVING nécessite simplement une ligne après GROUP BY. L'extrait suivant résume la syntaxe requise pour utiliser une clause HAVING:

SELECT
	aggregate_function(column)
FROM
	table
GROUP BY column_to_aggregate_on
HAVING condition_on_aggregate_metric;

Cette syntaxe est concise, mais voyons comment elle fonctionne à travers des exemples !

Exemples de HAVING

Supposons que nous voulions savoir quels films les gens louent pour des durées plus ou moins longues. Nous pourrions nous intéresser à la durée de location par classement. Par exemple, se concentrer sur les films dont la durée de location est plus courte pourrait nous permettre d'avoir une rotation globale plus rapide. Voyons ce que les données peuvent nous apprendre sur cette question !

Nous créons deux métriques agrégées regroupées par classement. Ensuite, nous utilisons HAVING pour filtrer le tableau résultant sur la durée moyenne de location (avg_rentdur).

SELECT
	rating,
	COUNT(*) AS films,
	AVG(rental_duration),
	AVG(length)
FROM
	film
GROUP BY rating
HAVING AVG(rental_duration) > 5

HAVING Cette fonction sélectionne les données en fonction d'une condition sur un groupe que nous avons créé avec une fonction d'agrégation (AVG).

ratingfilmsAVG(rental_duration)AVG(length)
PG1945.0825112.0052
NC-172105.1429113.2286
PG-132235.0538120.4439

Le résultat ne comprend pas les films classés G et R, car leur durée moyenne de location est inférieure à 5 jours. Les gens louent des films classés PG, PG-13 ou NC-17 pendant des périodes plus longues.

Intéressant !

Puisque nous examinons les catégories en fonction de leur durée de location, filtrons davantage nos résultats. Nous allons également supprimer les classements dont la durée moyenne est supérieure à deux heures. Pour ce faire, nous ajoutons une autre condition de groupe à la clause HAVING:

SELECT
	rating,
COUNT(*) AS films,
AVG(rental_duration),
AVG(length)
FROM
	film
GROUP BY rating
HAVING AVG(rental_duration) > 5
	AND AVG(length) < 120;

La condition supplémentaire sur AVG(length) filtre le classement PG-13.

ratingfilmsAVG(rental_duration)AVG(length)
PG1945.0825112.0052
NC-172105.1429113.2286

Bien joué !

Vous ne pouvez pas utiliser WHERE pour filtrer des groupes

Nous avons mentionné que HAVING est similaire à WHERE, mais nous les utilisons dans des scénarios différents. Voyons comment cela se passe dans notre exemple.

Remplaçons HAVING par WHERE dans la requête que nous venons d'écrire :

SELECT
	rating,
	COUNT(*) AS films,
	AVG(rental_duration),
	AVG(length)
FROM
	film
GROUP BY rating
WHERE AVG(rental_duration) > 5

Cependant, cela entraîne le message d'erreur suivant :

ERREUR 1064 (42000) : Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel correspondant à votre version du serveur MySQL pour connaître la syntaxe à utiliser près de 'WHERE avg_rentdur > 5' à la ligne 9.

Ceci est dû au fait que les clauses GROUP BY sont exécutées après les clauses WHERE. Cette requête tente d'appliquer WHERE sur avg_rentdur alors que avg_rentdur n'existe pas encore !

Cela signifie que nous ne pouvons utiliser WHERE que sur des données "brutes" et non sur des valeurs agrégées. Nous devons utiliser HAVING sur les métriques agrégées.

Utiliser à la fois WHERE et HAVING dans une requête

Nous avons vu que nous utilisons WHERE pour filtrer des lignes individuelles et HAVING pour filtrer des groupes. Pour mieux montrer leur différence, voyons un exemple dans lequel nous utilisons à la fois HAVING et WHERE !

Nous voulons savoir si nos résultats précédents changent lorsque nous nous concentrons sur les films courts. Pour cela, nous limitons la durée des films à 60 minutes.

Dans notre requête, nous faisons cela en appliquant WHERE sur la colonne length :

SELECT
	rating,
	COUNT(*) AS films,
	AVG(rental_duration),
	AVG(length)
FROM
	film
WHERE
	length < 60
GROUP BY rating
HAVING AVG(rental_duration) < 5;
ratingfilmsAVG(rental_duration)AVG(length)
G214.381053.0952
NC-17214.904851.3810
R114.636455.0000

Les résultats montrent que si nous nous concentrons uniquement sur les films courts, nous trouvons plusieurs films classés NC-17 avec des locations courtes en moyenne. Cette constatation peut nous donner des idées sur le type de films que nous pouvons introduire dans notre future sélection d'offres.

Vous voulez en savoir plus sur les différences entre HAVING et WHERE? Consultez notre article détaillé sur le sujet !

Apprenez-en plus sur le SQL HAVING !

Vous aimez ce que vous venez d'apprendre ? Faites en sorte de ne pas l'oublier ! Le meilleur moyen d'apprendre SQL est de résoudre des problèmes à l'aide d'exemples nouveaux et stimulants. Vous pouvez configurer le même environnement de test que nous utilisons ici, importer le même ensemble de données et réécrire les requêtes que vous venez d'apprendre.

Cependant, cela pourrait demander beaucoup de travail et vous ne feriez que recréer les mêmes exemples. Nous vous recommandons plutôt de consulter notre cours pratique! Il vous aidera à pratiquer le SQL HAVING et d'autres clauses à travers des exemples nouveaux et stimulants !

Qu'en pensez-vous ? Êtes-vous prêt à le suivre ?