Un défi persistant à l'aide de SQL est de déterminer le bon usage des existe et opérateurs IN . Les deux opérateurs peuvent produire les mêmes résultats , mais ne le font pas toujours . Aussi, il ya un important débat sur la façon dont chaque opérateur est optimisée pour la vitesse. Les utilisateurs doivent comprendre les différents attributs de chaque opérateur et d'essayer de déterminer à la fois la fonction appropriée. EN opérateur
L'opérateur IN renvoie une ligne si un cas où la valeur table.champ conditionné correspond à une liste de valeurs IN . EN est généralement utilisé dans le cadre d'une requête principale ou en conjonction avec une sous-requête
. Exemple 1: OÙ table.champ dans ('a' , 'b' , 'c')
exemple 2: OÙ table.champ dans ( le retour de Subquery ensemble de valeurs )
EXISTE opérateur
l' opérateur EXISTS renvoie toutes les lignes principales de la requête si la sous-requête ne contient aucune ligne . Photos
existe est utilisé uniquement en association avec une sous-requête . Lignes retournées sont déterminées par filtrage au niveau de la requête principale. Exemple: Lorsqu'il n'existe ( le retour de Subquery ensemble de valeurs )
Différence
ne peut pas évaluer les valeurs NULL , si ces lignes sont toujours faux, et ne reviennent pas . Photos
existe ne peut évaluer les valeurs NULL , de sorte que ces lignes peuvent être retournés.
similitudes
existe et exprimer leur soutien sous-requêtes corrélées et non corrélées , et les deux peuvent produire des principaux résultats similaires. Quand corrélée , existe et dans un match un champ de requête principale à un champ de sous-requête (ex : main.id = subquery.id ) . La sous-requête évalue ligne par ligne , pour chaque correspondance trouvée . Dans ce cas, IN et EXISTS renvoie les mêmes lignes basées sur les matchs de id similaires. Lorsque des non - corrélée, existe et dans le processus de leur sous-requêtes , puis correspondent résultats à la requête principale.
Performance des existe et EN
performance est déterminé par la base de données optimiseur et le plan d'exécution qu'il emploie pour le code exécuté . Pour existe et IN, l'optimiseur peut choisir différents chemins . Dans Oracle , c'est de PAS EXISTE éviter un anti -jointure , et de prouver généralement plus rapide que NOT IN. A la fin, quelques essais et erreurs est nécessaire de comparer le chemin le plus rapide en fonction de la base de données et sa version utilisés. Assurez-vous d' utiliser l'opérateur qui assure des résultats corrects , puis si tout est la même , essayez EXISTS substitution et pour voir vraiment ce qui est plus rapide.