Database
 sql >> Base de données >  >> RDS >> Database

Clause SQL HAVING pour les débutants

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)