# SQL EXISTS : vérifier une valeur dans une sous-requête

L’opérateur SQL `EXISTS` permet de vérifier qu’une sous-requête contient une valeur spécifique. Le résultat est une valeur booléenne. Il est également possible d’interroger plusieurs conditions.

## Qu’est-ce que SQL `EXISTS` ?

Dans le [Structured Query Language](https://www.ionos.fr/digitalguide/serveur/configuration/introduction-a-sql-a-laide-dexemples/) (SQL), il existe, outre les requêtes régulières, le principe des « sous-requêtes » ou *subqueries*. Si vous souhaitez vérifier qu’une **valeur définie est présente dans une de ces sous-requêtes**, vous pouvez utiliser l’opérateur SQL `EXISTS`. Celui-ci applique une condition définie à la sous-requête et affiche la valeur `TRUE` (donc « vrai ») si celle-ci est remplie. Ce n’est que si c’est le cas que la requête supérieure est exécutée. SQL `EXISTS` peut être exécuté avec les [commandes SQL](https://www.ionos.fr/digitalguide/serveur/configuration/commandes-sql/) `DELETE`, `INSERT`, `SELECT` et `UPDATE`.

## Syntaxe et fonctionnement

Nous allons maintenant vous montrer le fonctionnement de SQL `EXISTS` en combinaison avec `SELECT`. La syntaxe correspondante se présente comme suit :

```sql
SELECT Nom_de_la_colonne
FROM Nom_de_la_table
WHERE EXISTS
(SELECT Nom_de_la_colonne FROM Nom_de_la_table WHERE condition);
```

« nom\_de\_la\_colonne » désigne la ou les colonnes qui doivent être filtrées par `SELECT`. Ensuite, on indique le nom de la table dans laquelle la commande doit être exécutée. La vérification de la sous-requête se fait ensuite via `WHERE EXISTS`. À cet endroit, vous indiquez la sous-requête correspondante entre parenthèses.

Lors de l’exécution du code, la requête supérieure est d’abord lancée. Ensuite, le système lance la sous-requête. Si celle-ci donne un résultat (c’est-à-dire `TRUE`), le résultat de la requête principale est pris en compte. Mais si le résultat de la sous-requête est `NULL`, le résultat de la requête principale est ignoré.

## Exemple d’utilisation de l’opérateur

La signification et le fonctionnement de SQL `EXISTS` peuvent être illustrés le plus simplement possible par un exemple. Pour cela, nous créons deux tables différentes. Le premier tableau s’appelle « Liste des clients ». Différents clients d’une entreprise y sont répertoriés avec leur numéro de client, leur nom et leur ville. Ce tableau se présente comme suit :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Ville</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Berron</td>
      <td>Paris</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Froissy</td>
      <td>Strasbourg</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Sulis</td>
      <td>Strasbourg</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Verdon</td>
      <td>Lille</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Paré</td>
      <td>Compiègne</td>
    </tr>
  </tbody>
</table>

Notre deuxième tableau s’intitule « Commandes ». Il contient pour chaque entrée une référence d’article, le numéro de client et la date de la commande. Il se présente ainsi :

<table>
  <thead>
    <tr>
      <th>Référence de l’article</th>
      <th>Numéro de client</th>
      <th>Date de commande</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00282</td>
      <td>1172</td>
      <td>2024-01-17</td>
    </tr>
    <tr>
      <td>00311</td>
      <td>1361</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00106</td>
      <td>1431</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00378</td>
      <td>1274</td>
      <td>2024-01-30</td>
    </tr>
    <tr>
      <td>00418</td>
      <td>1118</td>
      <td>2024-02-03</td>
    </tr>
  </tbody>
</table>

Nous pouvons maintenant filtrer les clients qui ont passé au moins une commande entre le 17 janvier et le 3 février. Pour cela, nous utilisons le code suivant :

```sql
SELECT Numéro de client, Nom, Ville
FROM Liste des clients
WHERE EXISTS
(SELECT * FROM Commandes WHERE Liste des clients.Numéro de client = Commandes.Numéro de client);
```

Le système vérifie maintenant si les numéros de clients de la liste de clients se trouvent dans les commandes. Si c’est le cas (si la valeur est donc `TRUE`), les entrées correspondantes sont listées. Notre tableau se présente maintenant comme suit :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Ville</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1431</td>
      <td>Verdon</td>
      <td>Lille</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Paré</td>
      <td>Compiègne</td>
    </tr>
  </tbody>
</table>

## Interroger plusieurs conditions

Vous avez également la possibilité d’interroger **plusieurs conditions** et de spécifier ainsi encore plus votre sélection. Dans l’exemple suivant, nous voulons ainsi vérifier si certains numéros de clients sont inclus, mais aussi la ville de Lille. Le code ressemble à ceci :

```sql
SELECT Numéro de client, Nom, Ville
FROM Liste de clients
WHERE EXISTS
(SELECT * FROM Commandes WHERE Liste des clients.Numéro de client = Commandes.Numéro de client AND Ville = 'Lille');
```

Ici aussi, le résultat est `TRUE` et la sortie est celle-ci :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Ville</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1431</td>
      <td>Verdon</td>
      <td>Lille</td>
    </tr>
  </tbody>
</table>

## Combinaison avec `NOT`

Vous pouvez aussi procéder inversement avec SQL `EXISTS`. Dans l’exemple suivant, nous souhaitons voir tous les clients qui n’ont **pas** passé de commande pendant la période correspondante. Pour cela, nous insérons le **complément** `NOT`.

```sql
SELECT Numéro de client, Nom, Ville
FROM Liste de clients
WHERE NOT EXISTS
(SELECT * FROM Commandes WHERE Liste des clients.Numéro de client = Commandes.Numéro de client);
```

La sortie sera alors la suivante :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Ville</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Berron</td>
      <td>Paris</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Froissy</td>
      <td>Strasbourg</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Sulis</td>
      <td>Strasbourg</td>
    </tr>
  </tbody>
</table>

## Alternatives à SQL `EXISTS`

Il existe quelques alternatives à SQL `EXISTS`, qui vous permettent également d’examiner des sous-requêtes pour des entrées spécifiques. Les options les plus pratiques sont les opérateurs `IN` et `JOIN`, que vous pouvez tous deux spécifier selon vos besoins.

Conseil Des performances de pointe et un conseil personnalisé ! 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 avez le choix entre MSSQL, MySQL et MariaDB. Choisissez le modèle qui correspond le mieux à vos besoins !


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