Um desafio persistente no uso de SQL é que determinam o uso adequado do existe e operadores. Os dois operadores podem produzir os mesmos resultados , mas nem sempre o fazem . Além disso, há um debate substancial sobre como cada operador é otimizada para velocidade . Os usuários devem entender os diferentes atributos de cada operador e experimentar os dois para determinar a função apropriada. Operador
O operador IN retorna uma linha se um valor table.field ONDE condicionado corresponde a uma lista de valores em . IN é normalmente usado como parte de uma consulta principal ou em conjunto com uma subconsulta
Exemplo 1: . ONDE table.field em ('a' , 'b' , 'c ')
exemplo 2: ONDE table.field em ( conjunto de retorno de subconsulta de valores ),
EXISTE operador
o operador EXISTS retorna todas as linhas da consulta principal, se a subconsulta contém nenhuma linha.
existe apenas é utilizada em conjunção com um sub-consulta. Linhas retornadas são determinados pela filtragem ao nível da consulta principal. Exemplo: ONDE EXISTE ( conjunto de retorno de subconsulta de valores)
Diferença
IN não pode avaliar nulos , então as linhas são sempre falsas , e não voltou .
EXISTE pode avaliar nulos , então as linhas podem ser devolvidos.
Semelhanças
existe e tanto apoio subqueries correlacionados e não correlacionados , e tanto pode produzir principais resultados semelhantes. Quando correlacionados, existe e jogo um campo de consulta principal para um campo de subconsulta (ex: main.id = subquery.id ) . A subconsulta avalia linha por linha , para cada correspondência encontrada. Neste caso, IN e EXISTS retornará as mesmas linhas com base em partidas ID similares. Quando não correlacionados , existe e processo de seus subconsultas em primeiro lugar, em seguida, combinar resultados para a consulta principal .
Desempenho de EXISTS e IN
desempenho é determinado pelo banco de dados otimizador eo plano de execução que emprega para o código executado. Para EXISTS e IN, o otimizador pode escolher caminhos diferentes. No Oracle , isso é NÃO EXISTE evitar um anti- join, e, normalmente, provando mais rápido do que NOT IN. No final, algumas tentativas e erros é necessário para aferir o caminho mais curto , dependendo da base de dados e que é a versão que está sendo usado . Certifique-se de usar o operador que garante os resultados corretos em primeiro lugar, em seguida, se tudo é o mesmo , tente substituir existe e realmente ver que é mais rápido .