SQL IN vs SQL EXISTS
Cet article traite en détail des opérateurs IN et EXISTS en SQL . C'est une question courante entre les développeurs de savoir quelle est la différence entre ces deux opérateurs. Pour connaître la différence, discutons d'abord de chacun de ces opérateurs en détail.
Opérateur IN
L'opérateur IN est utilisé pour obtenir des résultats lorsqu'une valeur spécifiée correspond à une valeur dans un ensemble de valeurs ou est renvoyée par une requête interne. Cet opérateur peut également être utilisé avec le WHERE clause pour spécifier plusieurs valeurs. L'opérateur IN est souvent appelé l'acronyme de l'opérateur OR car il réduit l'utilisation de plusieurs conditions OR dans les requêtes SELECT, INSERT, UPDATE ou DELETE .
Dans cet opérateur, la sous-requête est résolue en premier et ce résultat est ensuite utilisé pour résoudre la requête externe.
Voici la syntaxe générale de l'opérateur IN :
SELECT column_name FROM table_name WHERE column_name IN (value1, value2, …);
Exemple :
Considérons la table Customer suivante.
ID_client | Nom_client | Ville | Profession |
1 | Harry | Calcutta | Entreprise |
2 | Ron | Bombay | Docteur |
3 | Albus | Delhi | Ingénieur |
4 | Dobby | Pune | Scientifique |
5 | Rogue | Bangalore | Étudiant |
Requête :
SELECT * FROM Customer WHERE Occupation IN ('Doctor', 'Scientist', 'Engineer');
La requête ci-dessus renverra tous les clients qui sont docteurs, scientifiques ou ingénieurs.
Sortie :
ID_client | Nom_client | Ville | Profession |
2 | Ron | Bombay | Docteur |
3 | Albus | Delhi | Ingénieur |
4 | Dobby | Pune | Scientifique |
Opérateur EXISTS
L'opérateur EXISTS, contrairement à l'opérateur IN, renvoie une valeur booléenne. Cet opérateur vérifie le résultat de la requête interne et renvoie une valeur booléenne, c'est-à-dire vrai ou faux. Si la requête interne renvoie un enregistrement unique ou multiple, l'opérateur renvoie vrai, sinon il renvoie faux lorsqu'aucun enregistrement n'est trouvé.
Cet opérateur est également efficace car il arrête tout traitement ultérieur dès que le premier événement vrai est détecté.
Voici la syntaxe de l'opérateur EXISTS :
SELECT column_names FROM table_name WHERE NOT EXISTS ( SELECT column_names FROM table_name WHERE condition );
Exemple :
Considérons la table Customer suivante.
ID_client | Nom | Profession | Âge |
101 | Harry | Ingénieur | 32 |
102 | Ron | Développeur | 30 |
103 | Dobby | Chef | 28 |
104 | Albus | Scientifique | 45 |
105 | Rogue | Charpentier | 26 |
106 | Gingembre | Acteur | 25 |
107 | NULL | NULL | NULL |
Considérons une autre table Commandes.
Order_id | ID_client | Product_name | Order_date |
1 | 101 | Ordinateur portable | 2021-01-10 |
2 | 103 | Bureau | 2021-02-12 |
3 | 106 | iPhone | 2021-02-15 |
4 | 104 | Mobile | 2021-03-05 |
5 | 102 | TV | 2021-03-20 |
Requête :
SELECT Name, Occupation FROM Customer WHERE EXISTS ( SELECT * FROM Orders WHERE Customer.Cust_id = Orders.Cust_id );
La requête ci-dessus renverra le nom et la profession de tous les clients qui ont passé au moins une commande.
Sortie :
Nom | Profession |
Harry | Ingénieur |
Ron | Développeur |
Dobby | Chef |
Albus | Scientifique |
Gingembre | Acteur |
Tableau des différences entre les opérateurs IN et EXISTS
Les principales différences entre l'opérateur IN et l'opérateur EXISTS sont répertoriées ci-dessous sous forme de tableau :
Opérateur IN | Opérateur EXISTS |
Cela minimise l'utilisation des conditions OU. | Il vérifie l'existence d'un enregistrement dans la requête interne. |
Il compare les valeurs de la requête interne avec la valeur de la requête externe. | Il ne compare pas les valeurs entre la requête interne et la sous-requête. |
Il vérifie toutes les valeurs à l'intérieur du bloc de la clause IN. | Il arrête toute exécution ultérieure dès que la première condition vraie est remplie. |
Il peut renvoyer TRUE, FALSE ou NULL. | Il renvoie soit TRUE ou FALSE. |
Il peut être utilisé pour vérifier les valeurs NULL. | Il ne peut pas être utilisé pour vérifier les valeurs NULL. |
Il est utilisé avec les sous-requêtes et les valeurs. | Il est utilisé uniquement avec les sous-requêtes. |
L'exécution est plus rapide lorsque le résultat de la requête interne est inférieur. | L'exécution est plus rapide même lorsque le résultat de la requête interne est volumineux. Il est plus efficace que l'opérateur IN. |
Syntaxe :SELECT nom_colonne FROM nom_table WHERE nom_colonne IN (sous-requête); | Syntaxe :SELECT nom_colonneFROM nom_tableWHERE [NOT] EXISTS (subquery); |
Conclusion :
Dans cette rubrique, une comparaison a été faite entre l'opérateur IN et les opérateurs EXISTS de SQL. Les deux opérateurs effectuent la même opération mais leur fonctionnement interne est différent. Ils ont un fonctionnement logique différent. N'importe lequel d'entre eux peut être sélectionné en fonction des besoins. Mais, si l'ensemble de données est volumineux, il est toujours recommandé d'opter pour l'opérateur EXISTS.