Contenu
Un défi constant dans l'utilisation de SQL consiste à déterminer l'utilisation appropriée des opérateurs EXISTS et IN. Les deux opérateurs peuvent produire les mêmes résultats, mais pas toujours. En outre, il existe un débat considérable sur la manière dont chaque opérateur est optimisé pour la vitesse. Les utilisateurs doivent comprendre les différents attributs de chaque opérateur et expérimenter les deux afin de déterminer l'utilisation appropriée.
Considérez vos objectifs SQL lorsque vous choisissez EXISTS ou IN (Jupiterimages / Photos.com / Getty Images)
Opérateur IN
L'opérateur IN renvoie une ligne si la valeur de champ d'une table satisfait à la condition WHERE dans une liste de valeurs IN. Il est généralement utilisé dans le cadre d'une requête principale ou en conjonction avec une sous-requête.
Exemple 1: WHERE table.field IN ('a', 'b', 'c') Exemple 2: WHERE table.field IN (sous-requête qui renvoie un ensemble)
Opérateur EXISTS
L'opérateur EXISTS renvoie toutes les lignes principales si une sous-requête contient des lignes. Il est utilisé uniquement avec une sous-requête. Les lignes renvoyées sont déterminées par le filtre de la requête principale.
Exemple: WHERE EXISTS (sous-requête qui renvoie un ensemble)
La différence
L'opérateur IN ne peut pas évaluer les valeurs NULL. Par conséquent, ces lignes sont toujours fausses et ne sont pas renvoyées, contrairement à l'opérateur EXISTS, qui évalue et renvoie les lignes avec des valeurs NULL.
Similitudes
EXISTS et IN prennent en charge les sous-requêtes corrélées et non corrélées, et les deux peuvent produire des résultats similaires. Lorsqu'elles sont corrélées, elles satisfont à un champ de requête principal pour un champ de sous-requête (par exemple: principal.id = sous-requête.id). La sous-requête évalue ligne par ligne, pour chaque occurrence trouvée. Dans ce cas, IN et EXISTS renverront les mêmes lignes en fonction de conditions "id" similaires. Lorsqu'ils sont décorrélés, les deux opérateurs traitent leurs sous-requêtes, puis combinent les résultats de la requête principale.
La performance
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, NOT EXISTS est généralement plus rapide que NOT IN. En fin de compte, certaines tentatives et erreurs sont nécessaires pour trier le chemin le plus court, en fonction de la base de données et de la version utilisées. Veillez à utiliser d'abord l'opérateur qui garantit les résultats corrects, puis essayez de remplacer les opérateurs pour voir lequel est le plus rapide.