EXISTS
est utilisé pour renvoyer une valeur booléenne, JOIN
renvoie une toute autre table
EXISTS
n'est utilisé que pour tester si une sous-requête renvoie des résultats et court-circuite dès qu'elle le fait. JOIN
est utilisé pour étendre un jeu de résultats en le combinant avec des champs supplémentaires d'une autre table avec laquelle il existe une relation.
Dans votre exemple, les requêtes sont sémantiquement équivalentes.
En général, utilisez EXISTS
quand :
- Vous n'avez pas besoin de renvoyer les données de la table associée
- Vous avez des doublons dans la table associée (
JOIN
peut provoquer des lignes en double si les valeurs sont répétées) - Vous voulez vérifier l'existence (utilisez à la place de
LEFT OUTER JOIN...NULL
état)
Si vous avez des index appropriés, la plupart du temps, le EXISTS
fonctionnera de la même manière que le JOIN
. L'exception concerne les sous-requêtes très compliquées, où il est normalement plus rapide d'utiliser EXISTS
.
Si votre JOIN
la clé n'est pas indexée, il peut être plus rapide d'utiliser EXISTS
mais vous devrez tester votre situation spécifique.
JOIN
la syntaxe est plus facile à lire et plus claire normalement aussi.