Retour à la liste des articles Articles
6 minutes de lecture

Tutoriel SQL HAVING

Apprenez à utiliser la clause HAVING SQL pour filtrer des groupes à l'aide de vos propres conditions.

La clause HAVING SQL est souvent un concept difficile à appréhender, surtout pour les débutants. De plus, ses cas d'utilisation spécifiques peuvent être difficiles à visualiser sans exemples précis basés sur des ensembles de données du monde réel. Dans ce tutoriel, vous apprendrez à appliquer la clause SQL HAVING pour filtrer des groupes d'enregistrements en fonction de conditions spécifiques. Vous verrez des exemples où nous appliquons ce concept pour résoudre des problèmes commerciaux sur un ensemble de données réaliste.

La fonction de la clause HAVING SQL

La clause SQL HAVING est généralement utilisée avec la clause GROUP BY pour filtrer des groupes de lignes retournées. Les lignes ne sont incluses dans le groupe que si la condition spécifiée est VRAIE.

La clause SQL GROUP BY organise les données en groupes sur la base d'une ou de plusieurs valeurs communes ; elle est le plus souvent utilisée pour obtenir des informations récapitulatives et calculer des statistiques agrégées. Si vous souhaitez une mise à jour plus approfondie sur ce sujet, consultez cet article sur le SQL GROUP BY.

Il peut y avoir une certaine confusion entre WHERE et HAVING, mais la différence s'explique facilement. La clause WHERE applique une condition sur l'ensemble de la colonne en filtrant les lignes individuelles. Elle ne fonctionne pas avec les fonctions d'agrégation telles que SUM() et AVG(). En revanche, HAVING applique des conditions de filtrage sur les groupes créés par la clause GROUP BY. Elle peut être utilisée avec les fonctions d'agrégation.

Par exemple, considérons le tableau ci-dessous. Il présente une liste de clients regroupés par ville dans plusieurs pays. Si nous voulions voir les groupes de villes comptant 3 clients ou plus, nous aurions besoin d'une clause HAVING qui satisfasse cette condition pour chacune des villes (c'est-à-dire les groupes).

CustomerIDCityCountry
009BerlinGermany
045BerlinGermany
101BerlinGermany
098BernSwitzerland
003BernSwitzerland
154Buenos AiresArgentina
111Buenos AiresArgentina
039Buenos AiresArgentina
191WallaPoland

En d'autres termes, la clause HAVING est essentiellement une clause WHERE qui opère sur les enregistrements renvoyés par GROUP BY. (Nous avons également une comparaison plus approfondie entre HAVING et WHERE si vous souhaitez aller plus loin).

La syntaxe SQL HAVING

HAVING ne fonctionnera pas sans la clause GROUP BY. Elle doit suivre la clause GROUP BY dans une requête et doit précéder la clause ORDER BY (si vous en utilisez une). Seuls les groupes qui répondent aux critères de HAVING seront renvoyés.

Par exemple, essayons la requête suivante sur la table customers table :

SELECT COUNT(CustomerID), City, Country
FROM Customers
WHERE Country = 'Brazil'
GROUP BY City, Country
HAVING COUNT(CustomerID) > 1

Que se passe-t-il dans cette requête ?

  • Premièrement, la clause WHERE filtre les lignes applicables pour le pays "Brésil".
  • Deuxièmement, la clause GROUP BY regroupe les entrées en fonction des valeurs des colonnes City et Country.
  • Troisièmement, la clause HAVING filtre les groupes - dans ce cas, nous ne sommes intéressés que par les villes brésiliennes qui ont plus d'un client.

Le site LearnSQL.fr SQL pour les débutants couvre la syntaxe et l'application de la clause HAVING dans un environnement attrayant et interactif. Je vous le recommande si vous souhaitez une pratique concrète. Mais d'abord, voyons d'autres exemples de HAVING.

Exemples de HAVING SQL

Plongeons dans des exemples présentant différentes fonctions d'agrégation afin de comprendre comment fonctionne réellement la clause HAVING. Nous allons utiliser la table client suivante OrderDetails suivante. Elle comporte un total de 518 lignes de données de commandes simples. Ces données comprennent des informations telles que les adresses Quantity et ProductID commandées, ainsi qu'une adresse unique OrderID pour chaque commande.

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
510249142
6102495140
518104432812

En tant qu'analyste de données, l'une de vos principales tâches consiste à obtenir des informations sur les données de vente. Nous allons explorer trois problèmes simples visant à trouver certaines de ces informations.

Exemple 1 : HAVING avec COUNT()

PROBLÈME : Lister tous les produits ayant fait l'objet de plus de 12 commandes individuelles.

RECHERCHE :

SELECT COUNT(ProductID), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING COUNT(ProductID) > 12

RESULTAT :

Number of Records: 5
COUNT(ProductID)ProductID
1431
1459
1362
1371
1472

Si nous n'avions pas inclus la clause HAVING, cette requête renverrait essentiellement le nombre d'enregistrements égal au nombre unique de ProductIDs. Ici, GROUP BY regroupe les commandes ayant le même ProductID. Ensuite, la clause HAVING place la condition de filtrage sur chacun de ces groupes et renvoie ceux dont le nombre est supérieur à 12.

Exemple 2 : HAVING avec SUM()

PROBLÈME : Lister tous les produits qui ont eu plus de 350 quantités totales commandées.

RECHERCHE :

SELECT SUM(Quantity), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING SUM(Quantity) > 350
ORDER BY SUM(Quantity) DESC

RESULTAT :

Number of Records: 3
COUNT(ProductID)ProductID
45831
43060
36935

Dans l'exemple ci-dessus, GROUP BY regroupe de façon similaire les commandes par ProductID. Ensuite, la clause HAVING place la condition de filtrage (la somme de la colonne Quantity doit être supérieure à 350) sur chacun de ces groupes. Enfin, ORDER BY renvoie les résultats dans l'ordre décroissant.

Exemple 3 : HAVING avec AVG()

PROBLÈME : Lister tous les produits qui ont eu plus de 35 quantités commandées en moyenne et au moins 4 commandes passées.

RECHERCHE :

SELECT AVG(Quantity), COUNT(ProductID), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING AVG(Quantity) > 35 AND COUNT(ProductID) > 3
ORDER BY AVG(Quantity) DESC

RESULTAT :

Number of Records: 6
AVG(Quantity)ProductIDCOUNT(ProductID)
41.25234
41359
38.75584
35.836012
35.6445
35.11339

Dans l'exemple 3, après avoir regroupé les commandes par ProductID, la clause HAVING place deux conditions de filtrage sur les groupes : une quantité moyenne de commande supérieure à 35 et un nombre de commandes individuelles supérieur à 3.

Sur la base des trois exemples ci-dessus, nous avons appris que ProductID 31, par exemple, était inclus dans le plus grand nombre de commandes individuelles (14) et avait également le plus grand nombre de quantités commandées sur l'ensemble des commandes passées (458). C'est certainement l'un des produits les plus populaires du magasin !

En outre, ProductIDs 23, 35 et 58 ont enregistré les quantités moyennes les plus élevées par commande. Des informations clés comme celles-ci sont précieuses, car elles permettent aux entreprises de savoir sur quels produits se concentrer et comment les commercialiser.

Maîtriser la clause HAVING de SQL

Comme nous venons de le voir, la clause HAVING est indispensable pour calculer des valeurs agrégées sur des groupes de données. Ainsi, elle est toujours utilisée en combinaison avec une clause GROUP BY et restreint les données sur les enregistrements groupés plutôt que sur les enregistrements individuels.

Si vous souhaitez en savoir plus sur l'utilisation de la clause HAVING en SQL, essayez notre cours SQL pour les débutants . Il couvre la clause HAVING en détail et explique plus en détail le regroupement, le filtrage et le classement des données. Vous y trouverez également de nombreux problèmes pratiques et des quiz qui vous permettront de vous familiariser avec les bases du langage SQL.