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.
A noter : 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 à plusieurs données.
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écutera 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 )
Dans l’exemple ci-dessus, 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
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.9 |
3 | Clavier | 2013-11-27 | 49.9 |
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 lesquels il y a effectivement un produit. Cette requête peut être interprétée de la façon suivante :
SELECT * FROM commande WHERE EXISTS ( SELECT * FROM produit WHERE c_produit_id = 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 |
Le résultat démontre bien que seul 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). Cette requête est intéressante sachant qu’elle n’influence pas le résultat de la requête principale, contrairement à l’utilisation d’une jointure qui va concaténer les colonnes des 2 tables jointes.