Diferenças entre EXISTS e IN no SQL

Considere suas metas de SQL ao escolher EXISTS ou IN.

Operador IN

O operador IN retorna uma linha se um valor de tabela.Where campo condicionado corresponde a uma lista de valores IN. IN é normalmente usado como parte de uma consulta principal ou junto com uma subconsulta. Exemplo 1: WHERE Table.Field em ('a', 'b', 'c') Exemplo 2: WHERE Table.Field in (conjunto de valores retornados pela subconsulta)

Operador EXISTE

O operador EXISTS retorna todas as linhas de consulta principais se a subconsulta contiver quaisquer linhas. EXISTS é usado apenas em conjunto com uma subconsulta. As linhas retornadas são determinadas pela filtragem no nível da consulta principal. Exemplo: WHERE EXISTS (conjunto de valores de retorno da subconsulta)

Diferença

IN não pode avaliar NULLs, portanto, as linhas são sempre falsas e não são retornadas. EXISTS podem avaliar NULL, portanto, as linhas podem ser retornadas.

Semelhanças

EXISTS e IN suportam subconsultas correlacionadas e não correlacionadas, e ambas podem produzir resultados principais semelhantes. Quando correlacionado, EXISTS e IN correspondem a um campo de consulta principal com um campo de subconsulta (ex: main.id = subquery.id). A subconsulta é avaliada linha por linha, para cada correspondência encontrada. Nesse caso, IN e EXISTS retornarão as mesmas linhas com base em identificações semelhantes. Quando eles não estão correlacionados, EXISTS e IN processam suas subconsultas primeiro e depois correspondem aos resultados com a consulta principal.

Desempenho de EXISTS e IN

O desempenho é determinado pelo otimizador de banco de dados e pelo plano de execução que ele usa para o código que é executado. Para EXISTS e IN, o otimizador pode escolher caminhos diferentes. No Oracle, NO EXISTS evita um anti-join e geralmente prova ser mais rápido do que NO IN. Em suma, requer um pouco de tentativa e erro para determinar o caminho mais rápido, dependendo do banco de dados e sua versão em uso. Certifique-se de usar o operador que garante os resultados corretos, se tudo a mesma coisa, tente substituir EXISTS e IN para ver realmente qual deles é mais rápido.