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 commandeEXISTSvérifie si la sous-requête retourne un résultat ou non, tandis queINvérifie la concordance d’une valeur avec une liste de valeurs.
Syntaxe
Section titled “Syntaxe”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_colonne1FROM table1WHERE 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.
Exemple concret
Section titled “Exemple concret”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 cWHERE 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 conditionc_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 cWHERE 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 vs IN
Section titled “EXISTS vs IN”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) |
Exemple de différence avec NULL
Section titled “Exemple de différence avec NULL”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);Exemple de performance
Section titled “Exemple de performance”Pour une grande table commande et une petite table produit :
-- IN sera généralement efficace si la sous-requête est petiteSELECT * 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 correspondanceSELECT * FROM commande c WHERE EXISTS (SELECT 1 FROM produit p WHERE c.c_produit_id = p.p_id);Cas d’usage d’EXISTS
Section titled “Cas d’usage d’EXISTS”| 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 cWHERE 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.
Bonnes pratiques
Section titled “Bonnes pratiques”-
Utilisez
SELECT 1dans la sous-requête plutôt queSELECT *: le contenu n’est pas utilisé, seul le nombre de lignes retournées compte. -
Privilégiez
EXISTSpour les grandes sous-requêtes : il s’arrête à la première ligne trouvée. -
Évitez
EXISTSlorsque la sous-requête est très petite :INpeut être plus lisible. -
Utilisez
NOT EXISTSpour trouver les enregistrements sans correspondance : c’est souvent plus efficace qu’unLEFT JOIN ... WHERE fk IS NULL. -
Testez les performances sur vos données réelles pour choisir entre
EXISTSetINdans chaque cas.
Prochain chapitre
Section titled “Prochain chapitre”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