Que fait la clause HAVING dans une requête ?
La clause HAVING est comme WHERE mais opère sur des enregistrements groupés renvoyés par un GROUP BY.
HAVING s’applique aux enregistrements groupés résumés, alors que WHERE s’applique aux enregistrements individuels.
Seuls les groupes qui répondent aux critères de HAVING seront renvoyés.
HAVING nécessite la présence d’une clause GROUP BY.
Les deux critères WHERE et HAVING peuvent être utilisés en même temps dans une même requête.
La syntaxe SQL HAVING
La syntaxe générale est
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition
La syntaxe générale avec ORDER BY est :
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition ORDER BY column-names
Id
FirstName
LastName
City
Country
Phone
.
SQL GROUP BY Exemples
Problème : Lister le nombre de clients dans chaque pays.
N’inclure que les pays ayant plus de 10 clients.
N’inclure que les pays ayant plus de 10 clients.
SELECT COUNT(Id), Country FROM Customer GROUP BY CountryHAVING COUNT(Id) > 10
Résultat : 3 enregistrements
Count | Country |
---|---|
11 | France |
11 | Allemagne |
13 | USA |
Id
Prénom
Nom de famille
Ville
Pays
Téléphone
Problème : Dressez la liste du nombre de clients dans chaque pays,
à l’exception des États-Unis, triés de haut en bas.
Ne retenez que les pays ayant 9 clients ou plus.
à l’exception des États-Unis, triés de haut en bas.
Ne retenez que les pays ayant 9 clients ou plus.
SELECT COUNT(Id), Country FROM Customer WHERE Country 'USA' GROUP BY CountryHAVING COUNT(Id) >= 9 ORDER BY COUNT(Id) DESC
Résultat : 3 enregistrements
Count | Country |
---|---|
11 | France |
11 | Allemagne |
9 | Brésil |
Id
Date de la commande
Numéro de la commande
CustomerId
Montant total
Id
Prénom
Nom de famille
Ville
Pays
Téléphone
.
Problème : Lister tous les clients ayant des commandes moyennes
entre 1000 et 1200 dollars.
entre 1000 et 1200 dollars.
SELECT AVG(TotalAmount), FirstName, LastName FROM O JOIN Customer C ON O.CustomerId = C.Id GROUP BY FirstName, LastNameHAVING AVG(TotalAmount) BETWEEN 1000 AND 1200
Résultat : 10 enregistrements
Moyenne | Prénom | Nom de famille | |
---|---|---|---|
1081.215000 | Miguel | Angel Paolino | |
1063.420000 | Isabel | de Castro | |
1008.440000 | Alexander | Feuer | |
1062.038461 | Thomas | Hardy | |
1107.806666 | Pirkko | Koskitalo | 1174.945454 | Janete | Limeira |
1073.621428 | Antonio | Moreno | 1065.385000 | Rita | Müller | 1183.010000 | José | Pedro Freyre |
1057.386666 | Carine | Schmitt |