Contente
Um desafio constante no uso de SQL é a determinação do uso adequado dos operadores EXISTS e IN. Os dois operadores podem produzir os mesmos resultados, mas nem sempre. Além disso, há um debate considerável sobre a forma como cada operador é otimizado para velocidade. Os usuários devem entender os diferentes atributos de cada operador e experimentar os dois para determinar a utilização apropriada.
Considere seus objetivos em SQL ao escolher EXISTS ou IN (Jupiterimages/Photos.com/Getty Images)
Operador IN
O operador IN retorna uma linha se o valor do campo de uma tabela satisfaz a condição WHERE em uma lista de valores IN. Ele é normalmente usado como parte de uma consulta principal ou em conjunto com uma subconsulta.
Exemplo 1: WHERE tabela.campo IN ('a', 'b', 'c') Exemplo 2: WHERE tabela.campo IN (Subconsulta que retorna um conjunto)
Operador EXISTS
O operador EXISTS retorna todas as linhas principais se uma subconsulta contém alguma linha. Ele é usado apenas em conjunto com uma subconsulta. As linhas retornadas são determinadas pelo filtro na consulta principal.
Exemplo: WHERE EXISTS (Subconsulta que retorna um conjunto)
Diferença
O operador IN não pode avaliar valores NULL, portanto tais linhas sempre serão falsas, e não serão retornadas, ao contrário do operador EXISTS, que avalia e retorna linhas com valor NULL.
Similaridades
Ambos EXISTS e IN suportam subconsultas correlacionadas e não correlacionadas, e ambos podem produzir resultados semelhantes. Quando correlacionados, eles satisfazem um campo de consulta principal para um campo de subconsulta (ex: principal.id = subconsulta.id). A subconsulta avalia linha por linha, para cada ocorrência encontrada. Neste caso, IN e EXISTS retornarão as mesmas linhas com base em condições "id" semelhantes. Quando não correlacionados, os dois operadores processam suas subconsultas e então combinam os resultados para a consulta principal.
Performance
O desempenho é determinado pelo otimizador do banco de dados e o plano de execução utilizado para o código executado. Para EXISTS e IN, o otimizador pode escolher caminhos diferentes. No Oracle, o NOT EXISTS normalmente é mais rápido do que o NOT IN. No final, algumas tentativas e erros são necessárias para classificar o caminho mais curto, dependendo da base de dados e a versão que está sendo usada. Certifique-se de usar o operador que garanta os resultados corretos em primeiro lugar, e em seguida tente substituir os operadores para ver qual é o mais rápido.