Différences entre EXISTS et IN en SQL
Opérateur IN
L'opérateur IN renvoie une ligne s'il s'agit d'une valeur de table. Le champ conditionné WHERE correspond à une liste de valeurs IN. IN est normalement utilisé dans le cadre d'une requête principale ou avec une sous-requête. Exemple 1: WHERE Table.Field in ('a', 'b', 'c') Exemple 2: WHERE Table.Field in (ensemble de valeurs renvoyées par la sous-requête)
Opérateur EXISTS
L'opérateur EXISTS renvoie toutes les lignes de requête principales si la sous-requête contient des lignes. EXISTS est uniquement utilisé avec une sous-requête. Les lignes renvoyées sont déterminées par filtrage au niveau de la requête principale. Exemple: WHERE EXISTS (ensemble de valeurs de retour de la sous-requête)
La différence
IN ne peut pas évaluer les valeurs NULL. Par conséquent, les lignes sont toujours fausses et elles ne sont pas renvoyées. EXISTS peut évaluer NULL, ainsi les lignes peuvent être retournées.
Similitudes
EXISTS et IN prennent en charge les sous-requêtes corrélées et non corrélées et peuvent toutes deux produire des résultats principaux similaires. Lorsqu'elles sont corrélées, EXISTS et IN font correspondre un champ de requête principal avec un champ de sous-requête (ex: main.id = subquery.id). La sous-requête est évaluée ligne par ligne pour chaque correspondance trouvée. Dans ce cas, IN et EXISTS renverront les mêmes lignes en fonction d'identifications similaires. Lorsqu'elles ne sont pas corrélées, EXISTS et IN traitent d'abord leurs sous-requêtes, puis font correspondre les résultats à la requête principale.
Performance de EXISTS et IN
Les performances sont déterminées par l'optimiseur de base de données et le plan d'exécution utilisé pour le code exécuté. Pour EXISTS et IN, l’optimiseur peut choisir différents chemins. Dans Oracle, NO EXISTS évite les anti-jointures et s'avère généralement plus rapide que NO IN. En bref, il faut quelques essais et erreurs pour déterminer le chemin le plus rapide en fonction de la base de données et de sa version utilisée. Assurez-vous d’utiliser l’opérateur qui garantit les résultats corrects. Si tout de même, essayez de remplacer EXISTS et IN pour voir lequel est le plus rapide.