Skip to content

EXISTS – Vérifier l'existence de lignes

Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 5 minutes


Dans le langage SQL, la commande EXISTS s’utilise dans une clause conditionnelle pour savoir s’il y a une présence ou non de lignes lors de l’utilisation d’une sous-requête.

Bon à savoir : Cette commande n’est pas à confondre avec la clause IN. La commande EXISTS vérifie si la sous-requête retourne un résultat ou non, tandis que IN vérifie la concordance d’une valeur avec une liste de valeurs.


L’utilisation basique de la commande EXISTS consiste à vérifier si une sous-requête retourne un résultat ou non, en utilisant EXISTS dans la clause conditionnelle. La requête externe s’exécute uniquement si la requête interne retourne au moins un résultat.

SELECT nom_colonne1
FROM table1
WHERE EXISTS (
SELECT nom_colonne2
FROM table2
WHERE nom_colonne3 = 10
);

Explication : S’il y a au moins une ligne dans table2 dont nom_colonne3 contient la valeur 10, alors la sous-requête retournera au moins un résultat. Dès lors, la condition sera vérifiée et la requête principale retournera les résultats de la colonne nom_colonne1 de table1.


Dans le but de montrer un exemple concret d’application, imaginons un système composé d’une table qui contient des commandes et d’une table contenant des produits.

Table « commande » :

c_id c_date_achat c_produit_id c_quantite_produit
1 2014-01-08 2 1
2 2014-01-24 3 2
3 2014-02-14 8 1
4 2014-03-23 10 1

Table « produit » :

p_id p_nom p_date_ajout p_prix
2 Ordinateur 2013-11-17 799.90
3 Clavier 2013-11-27 49.90
4 Souris 2013-12-04 15
5 Ecran 2013-12-15 250

Il est possible d’effectuer une requête SQL qui affiche les commandes pour lesquelles il y a effectivement un produit correspondant dans la table produit :

SELECT *
FROM commande c
WHERE EXISTS (
SELECT 1
FROM produit p
WHERE c.c_produit_id = p.p_id
);

Résultat :

c_id c_date_achat c_produit_id c_quantite_produit
1 2014-01-08 2 1
2 2014-01-24 3 2

Observations :

  • Les commandes n°1 et n°2 ont un produit qui se trouve dans la table produit (cf. la condition c_produit_id = p_id).
  • Les commandes n°3 et n°4 utilisent des produits qui n’existent pas dans la table produit (ids 8 et 10) → elles ne sont pas affichées.

NOT EXISTS – Vérifier l’absence de lignes

Section titled “NOT EXISTS – Vérifier l’absence de lignes”

NOT EXISTS est l’opposé logique de EXISTS. Il retourne TRUE lorsque la sous-requête ne retourne aucune ligne.

SELECT *
FROM commande c
WHERE NOT EXISTS (
SELECT 1
FROM produit p
WHERE c.c_produit_id = p.p_id
);

Résultat :

c_id c_date_achat c_produit_id c_quantite_produit
3 2014-02-14 8 1
4 2014-03-23 10 1

Explication : Cette requête retourne les commandes pour lesquelles il n’y a pas de produit correspondant dans la table produit (c’est-à-dire les commandes dont le produit a été supprimé).


EXISTS et IN peuvent parfois produire les mêmes résultats, mais leur fonctionnement est différent :

Critère EXISTS IN
Fonctionnement Vérifie l’existence d’au moins une ligne Compare une valeur avec une liste de valeurs
Performance Généralement plus rapide pour les grandes sous-requêtes Peut être plus lent avec des sous-requêtes volumineuses
Sous-requête corrélée Supporte les sous-requêtes corrélées Supporte les sous-requêtes non corrélées
Valeurs NULL Peu importe, seules les lignes comptent Gère les NULL différemment (peut produire des résultats inattendus)

Si la sous-requête contient des valeurs NULL, IN peut se comporter différemment :

-- Avec IN (peut ne rien retourner si la sous-requête contient des NULL)
SELECT * FROM commande WHERE c_produit_id IN (SELECT p_id FROM produit);
-- Avec EXISTS (pas de problème avec NULL)
SELECT * FROM commande c WHERE EXISTS (SELECT 1 FROM produit p WHERE c.c_produit_id = p.p_id);

Pour une grande table commande et une petite table produit :

-- IN sera généralement efficace si la sous-requête est petite
SELECT * FROM commande WHERE c_produit_id IN (SELECT p_id FROM produit);

Pour une grande table produit et une petite table commande :

-- EXISTS sera généralement plus efficace car il s'arrête à la première correspondance
SELECT * FROM commande c WHERE EXISTS (SELECT 1 FROM produit p WHERE c.c_produit_id = p.p_id);

Situation Utilisation recommandée
Vérifier si au moins une ligne existe EXISTS
Vérifier qu’aucune ligne n’existe NOT EXISTS
Filtrer en fonction d’une relation avec une autre table EXISTS (plus performant que IN sur les grandes tables)
Vérifier l’existence de lignes avec des conditions complexes EXISTS (permet des sous-requêtes corrélées)
Vérifier si une valeur est dans une liste statique IN (pour une liste de valeurs explicites)

Utiliser EXISTS avec des conditions multiples

Section titled “Utiliser EXISTS avec des conditions multiples”

EXISTS permet d’utiliser des conditions complexes dans la sous-requête :

SELECT *
FROM commande c
WHERE EXISTS (
SELECT 1
FROM produit p
WHERE c.c_produit_id = p.p_id
AND p.p_prix > 100
AND p.p_date_ajout > '2013-01-01'
);

Cette requête retourne les commandes dont le produit associé a un prix supérieur à 100€ et a été ajouté après le 1er janvier 2013.


  1. Utilisez SELECT 1 dans la sous-requête plutôt que SELECT * : le contenu n’est pas utilisé, seul le nombre de lignes retournées compte.

  2. Privilégiez EXISTS pour les grandes sous-requêtes : il s’arrête à la première ligne trouvée.

  3. Évitez EXISTS lorsque la sous-requête est très petite : IN peut être plus lisible.

  4. Utilisez NOT EXISTS pour trouver les enregistrements sans correspondance : c’est souvent plus efficace qu’un LEFT JOIN ... WHERE fk IS NULL.

  5. Testez les performances sur vos données réelles pour choisir entre EXISTS et IN dans chaque cas.


Vous savez désormais comment vérifier l’existence de lignes avec EXISTS. Mais comment comparer une valeur à toutes les valeurs d’un ensemble ?

👉 Chapitre 41 : ALL – Comparer à un ensemble complet


Bonne continuation !
Junior TSAFACK – 08/08/2026