SQL HAVING : filtrer les résultats sur la base des fonctions d’agrégation
SQL HAVING
est une condition qui peut être appliquée à des entrées déjà regroupées. Elle fonctionne avec des fonctions d’agrégation et est utilisée pour restreindre les ensembles de résultats.
Qu’est-ce que SQL HAVING
?
En plus du WHERE bien connu, il existe dans le Structured Query Language (SQL) une autre condition qui est souvent utilisée. SQL HAVING
a été introduite pour filtrer les données en fonction de critères spécifiques après les avoir regroupées. Cette condition est appliquée avec la commande SQL SELECT
et l’instruction SQL GROUP BY
. Alors que cette dernière regroupe les résultats, SQL HAVING
limite cet ensemble de résultats à l’aide de différentes fonctions d’agrégation. Cette condition a été introduite parce que WHERE ne peut pas interagir avec des fonctions d’agrégation comme SQL AVG()
, SQL COUNT()
, MAX()
, MIN()
et SUM()
. SQL HAVING
est utilisé après les instructions WHERE
(si elles existent) et GROUP BY
, mais avant ORDER BY
.
- Virtualisation complète avec accès root
- Trafic illimité et jusqu'à 1 Gbit/s de bande passante
- Stockage SSD NVMe rapide et édition Plesk Web Host
Syntaxe et fonctionnement
Pour comprendre le fonctionnement et l’utilité de SQL HAVING
, examinons sa syntaxe. La voici :
SELECT nom_de_la_colonne(n)
FROM nom_du_tableau
WHERE condition
GROUP BY nom_de_la_colonne(n)
HAVING condition
ORDER BY nom_de_la_colonne(n);
sqlSouvent, une fonction d’agrégation est appliquée à une ou plusieurs colonnes. Ensuite, pour la localisation, on indique le nom de la table. La condition WHERE
est facultative. GROUP BY
rassemble des valeurs identiques en groupes qui sont filtrées de manière encore plus précise avec HAVING
et placés dans l’ordre souhaité avec ORDER BY
.
Exemple de condition
La manière la plus simple d’illustrer le fonctionnement de SQL HAVING
est de prendre un exemple simple. Pour cela, nous créons un tableau appelé « Liste de clients ». Celui-ci contient les colonnes « Numéro de client », « Nom », « Ville » et « Articles » :
Numéro de client | Nom | Emplacement | Articles |
---|---|---|---|
1427 | Berron | Paris | 13 |
1377 | Froissy | Strasbourg | 9 |
1212 | Sulis | Strasbourg | 15 |
1431 | Verdon | Lille | 22 |
1118 | Paré | Paris | 10 |
Nous utilisons maintenant SQL HAVING
pour savoir combien de clients et clientes de Strasbourg ont commandé dix articles ou plus. Pour cela, nous utilisons le code suivant et indiquons le nombre à l’aide d’un alias SQL comme « NombreCommandes » :
SELECT Ville, COUNT(Ville) AS NombreCommandes
FROM Liste_de_clients
WHERE Ville = 'Strasbourg'
GROUP BY Ville, Articles
HAVING Articles > 10;
sqlLa sortie correspondante se présente comme suit :
Ville | NombreCommandes |
---|---|
Strasbourg | 1 |
La condition en combinaison avec INNER JOIN
Vous pouvez également combiner SQL HAVING
avec le mot-clé « INNER JOIN ». Pour illustrer cela, créons une deuxième table nommée « Article_01 », qui enregistre le nombre d’occurrences et la date de commande pour chaque article. Cette table contient les colonnes suivantes : numéro de commande, numéro de client, quantité et date de commande. Voici un exemple de sa structure :
Numéro de commande | Numéro de client | Occurrences | Date |
---|---|---|---|
00283 | 1427 | 4 | 2024-01-15 |
00284 | 1211 | 7 | 2024-01-19 |
00285 | 1275 | 15 | 2024-01-29 |
00286 | 1431 | 10 | 2024-02-01 |
00287 | 1427 | 9 | 2024-02-05 |
Maintenant, nous pouvons demander au système de nous montrer tous les clients qui ont passé plus d’une commande. Le code approprié est le suivant :
SELECT Liste de clients.Nom, COUNT(Article_01.Numéro de commande) AS NombreCommandes
FROM (Article_01
INNER JOIN Liste de clients ON Article_01.Numéro de client = Liste de clients.Numéro de client)
GROUP BY Nom
HAVING COUNT(Article_01.Numéro de commande) > 1;
sqlVoici la sortie que nous obtenons alors :
Nom | NombreCommandes |
---|---|
Berron | 2 |
Alternative à SQL HAVING
Une alternative à SQL HAVING
est WHERE
. Les deux options ne peuvent toutefois pas être utilisées exactement de la même manière. WHERE
est utilisé pour des entrées individuelles et peut être combiné avec DELETE
ou UPDATE
en plus de SELECT
. HAVING
, en revanche, est exclusivement prévue pour les entrées groupées et n’est compatible qu’avec SELECT
. WHERE
est utilisé avant GROUP BY
, tandis que HAVING
s’utilise après. De plus, seul SQL HAVING
peut travailler avec des fonctions d’agrégation.
Un serveur parfaitement adapté à vos besoins : avec le serveur d’hébergement SQL de IONOS, vous choisissez entre MSSQL, MySQL et MariaDB et profitez d’une solide architecture de sécurité, d’excellentes performances et d’un conseil personnalisé à tout moment.