En SQL, le HAVING
La clause peut être utilisée pour spécifier une condition de recherche pour un groupe ou un agrégat.
Le HAVING
La clause est généralement utilisée avec le GROUP BY
clause. Dans les cas où ce n'est pas le cas, il existe un groupe implicite unique et agrégé.
Le HAVING
la clause est similaire à WHERE
clause, sauf que WHERE
filtre les lignes individuelles, tandis que HAVING
groupes de filtres. Le WHERE
la clause filtre les données avant il est groupé, alors que HAVING
filtre les données après il est groupé.
Exemple 1 – HAVING
avec COUNT()
Supposons que nous ayons le tableau suivant :
SELECT * FROM Pets;
Résultat :
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Nous pourrions exécuter la requête suivante sur cette table :
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;
Résultat :
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | +-------------+---------+
Dans ce cas, nous avons utilisé le HAVING
clause en conjonction avec le GROUP BY
clause pour renvoyer uniquement les lignes qui ont un COUNT(PetTypeId)
supérieur à 2
. Cela utilise le COUNT()
fonction, qui est une fonction d'agrégation standard SQL disponible dans la plupart des principaux SGBDR.
Si nous omettons le HAVING
clause, nous obtenons un résultat de plus :
SELECT
PetTypeId,
COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
ORDER BY Count DESC;
Résultat :
+-------------+---------+ | PetTypeId | Count | |-------------+---------| | 3 | 4 | | 2 | 3 | | 1 | 1 | +-------------+---------+
Exemple 2 – HAVING
avec SUM()
Voici un autre exemple. Cette fois, nous utilisons le HAVING
clause avec la SUM()
function, qui est une autre fonction d'agrégation disponible dans la plupart des principaux SGBDR (voir SQLite SUM()
pour un autre exemple).
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) > 1000000
ORDER BY CountryCode;
Résultat :
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Queensland | 1805236 | | AUS | Victoria | 2990711 | | AUS | West Australia | 1096829 | +---------------+-----------------+--------------+
Exemple 3 – HAVING
avec le IN
Opérateur
Vous n'êtes pas limité à l'opérateur ) pour les débutants » > opérateur supérieur à (>
) lors de l'utilisation de HAVING
clause. Vous pouvez utiliser les mêmes opérateurs que vous pouvez utiliser avec WHERE
clause (telle que =
, ) Operator for Beginners"><
, =) Operator for Beginners">>=
, IN
, LIKE
, etc.).
Voici un exemple qui utilise le IN
pour spécifier une plage de valeurs agrégées à renvoyer.
SELECT
CountryCode,
District,
SUM(Population) AS Population
FROM City
WHERE CountryCode IN ('AGO', 'ARE', 'AUS')
GROUP BY CountryCode, District
HAVING SUM(Population) IN (2022000, 3993949, 2990711)
ORDER BY CountryCode;
Résultat :
+---------------+-----------------+--------------+ | CountryCode | District | Population | |---------------+-----------------+--------------| | AGO | Luanda | 2022000 | | AUS | New South Wales | 3993949 | | AUS | Victoria | 2990711 | +---------------+-----------------+--------------+
Exemple 4 – HAVING
sans GROUP BY
Article
Bien que HAVING
est généralement utilisé avec le GROUP BY
clause, elle peut également être utilisée sans elle. Lorsqu'il est utilisé sans lui, il existe un seul groupe agrégé implicite.
Les résultats que vous obtenez peuvent dépendre de votre SGBD, mais voici un exemple réalisé dans SQL Server.
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) > 2000000;
Résultat :
+--------------+ | Population | |--------------| | 1429559884 | +--------------+
Cet exemple renvoie simplement la population agrégée de toutes les villes du tableau.
Voici ce qui se passe si nous échangeons l'opérateur supérieur à (>
) avec un opérateur inférieur à (<
).
SELECT
SUM(Population) AS Population
FROM City
HAVING SUM(Population) < 2000000;
Résultat :
(0 rows affected)