EXISTS
é usado para retornar um valor booleano, JOIN
retorna uma outra tabela EXISTS
é usado apenas para testar se uma subconsulta retorna resultados e causa um curto-circuito assim que o faz. JOIN
é usado para estender um conjunto de resultados combinando-o com campos adicionais de outra tabela com a qual existe uma relação. No seu exemplo, as consultas são semanticamente equivalentes.
Em geral, use
EXISTS
quando:- Você não precisa retornar dados da tabela relacionada
- Você tem dupes na tabela relacionada (
JOIN
pode causar linhas duplicadas se os valores forem repetidos) - Você deseja verificar a existência (use em vez de
LEFT OUTER JOIN...NULL
condição)
Se você tiver índices adequados, na maioria das vezes o
EXISTS
terá um desempenho idêntico ao JOIN
. A exceção está em subconsultas muito complicadas, onde normalmente é mais rápido usar EXISTS
. Se o seu
JOIN
chave não está indexada, pode ser mais rápido usar EXISTS
mas você precisará testar para sua circunstância específica. JOIN
sintaxe é mais fácil de ler e mais clara normalmente também.