# 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](https://www.ionos.fr/digitalguide/serveur/configuration/introduction-a-sql-a-laide-dexemples/) (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](https://www.ionos.fr/digitalguide/serveur/configuration/commandes-sql/) `SELECT` et l’instruction [SQL `GROUP BY`](https://www.ionos.fr/digitalguide/serveur/configuration/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()`](https://www.ionos.fr/digitalguide/serveur/configuration/sql-avg/), [SQL `COUNT()`](https://www.ionos.fr/digitalguide/serveur/configuration/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`.

## Syntaxe et fonctionnement

Pour comprendre le fonctionnement et l’utilité de SQL `HAVING`, examinons sa syntaxe. La voici :

```sql
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);
```

Souvent, 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 » :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Emplacement</th>
      <th>Articles</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Berron</td>
      <td>Paris</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Froissy</td>
      <td>Strasbourg</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Sulis</td>
      <td>Strasbourg</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Verdon</td>
      <td>Lille</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Paré</td>
      <td>Paris</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

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](https://www.ionos.fr/digitalguide/serveur/configuration/alias-sql/) comme « NombreCommandes » :

```sql
SELECT Ville, COUNT(Ville) AS NombreCommandes
FROM Liste_de_clients
WHERE Ville = 'Strasbourg'
GROUP BY Ville, Articles
HAVING Articles > 10;
```

La sortie correspondante se présente comme suit :

<table>
  <thead>
    <tr>
      <th>Ville</th>
      <th>NombreCommandes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Strasbourg</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

## 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 :

<table>
  <thead>
    <tr>
      <th>Numéro de commande</th>
      <th>Numéro de client</th>
      <th>Occurrences</th>
      <th>Date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00283</td>
      <td>1427</td>
      <td>4</td>
      <td>2024-01-15</td>
    </tr>
    <tr>
      <td>00284</td>
      <td>1211</td>
      <td>7</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00285</td>
      <td>1275</td>
      <td>15</td>
      <td>2024-01-29</td>
    </tr>
    <tr>
      <td>00286</td>
      <td>1431</td>
      <td>10</td>
      <td>2024-02-01</td>
    </tr>
    <tr>
      <td>00287</td>
      <td>1427</td>
      <td>9</td>
      <td>2024-02-05</td>
    </tr>
  </tbody>
</table>

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 :

```sql
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;
```

Voici la sortie que nous obtenons alors :

<table>
  <thead>
    <tr>
      <th>Nom</th>
      <th>NombreCommandes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Berron</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

## 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.

Conseil Un serveur parfaitement adapté à vos besoins : avec le [serveur d’hébergement SQL](https://www.ionos.fr/cloud/hebergement-serveur-sql "Hébergement SQL pour les bases de données MSSQL, MySQL et MariaDB | IONOS") 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.


This is a markdown version of: [https://www.ionos.fr/digitalguide/serveur/configuration/sql-having/](https://www.ionos.fr/digitalguide/serveur/configuration/sql-having/) for AI/LLM consumption.