SQL IN vs SQL EXISTS
Este artigo discute em detalhes os operadores IN e EXISTS no SQL . É uma pergunta comum entre os desenvolvedores qual é a diferença entre esses dois operadores. Para saber a diferença, vamos primeiro discutir sobre cada um desses operadores em detalhes.
Operador IN
O operador IN é usado para obter resultados quando um valor especificado corresponde a um valor em um conjunto de valores ou é retornado por uma consulta interna. Este operador também pode ser usado com o WHERE cláusula para especificar mais de um valor. O operador IN é frequentemente chamado de acrônimo para o operador OR porque reduz o uso de várias condições OR em consultas SELECT, INSERT, UPDATE ou DELETE .
Neste operador, a subconsulta é resolvida primeiro e esse resultado é usado para resolver a consulta externa.
A seguir está a sintaxe geral do operador IN:
SELECT column_name FROM table_name WHERE column_name IN (value1, value2, …);
Exemplo:
Vamos considerar a seguinte tabela Customer.
Cust_id | Cust_name | Cidade | Ocupação |
1 | Harry | Calcutá | Negócios |
2 | Rony | Mumbai | Doutor |
3 | Alvo | Delhi | Engenheiro |
4 | Dobby | Punha | Cientista |
5 | Snap | Bangalore | Aluno |
Consulta:
SELECT * FROM Customer WHERE Occupation IN ('Doctor', 'Scientist', 'Engineer');
A consulta acima retornará todos os clientes que são Médicos, Cientistas ou Engenheiros.
Saída:
Cust_id | Cust_name | Cidade | Ocupação |
2 | Rony | Mumbai | Doutor |
3 | Alvo | Delhi | Engenheiro |
4 | Dobby | Punha | Cientista |
Operador EXISTS
O operador EXISTS, diferentemente do operador IN, retorna um valor booleano. Este operador verifica o resultado da consulta interna e retorna um valor booleano, ou seja, verdadeiro ou falso. Se a consulta interna retornar um registro único ou múltiplo, o operador retornará true, caso contrário, retornará false quando nenhum registro for encontrado.
Esse operador também é eficiente, pois interrompe o processamento assim que o primeiro evento verdadeiro é detectado.
A seguir está a sintaxe do operador EXISTS:
SELECT column_names FROM table_name WHERE NOT EXISTS ( SELECT column_names FROM table_name WHERE condition );
Exemplo:
Vamos considerar a seguinte tabela Customer.
Cust_id | Nome | Ocupação | Idade |
101 | Harry | Engenheiro | 32 |
102 | Rony | Desenvolvedor | 30 |
103 | Dobby | Líder | 28 |
104 | Alvo | Cientista | 45 |
105 | Snap | Carpinteiro | 26 |
106 | Gengibre | Ator | 25 |
107 | NULO | NULO | NULO |
Vamos considerar outra tabela Orders.
ID_do pedido | Cust_id | Nome_do_produto | Data_do pedido |
1 | 101 | Computador portátil | 2021-01-10 |
2 | 103 | Computador | 2021-02-12 |
3 | 106 | IPhone | 2021-02-15 |
4 | 104 | Celular | 2021-03-05 |
5 | 102 | TV | 2021-03-20 |
Consulta:
SELECT Name, Occupation FROM Customer WHERE EXISTS ( SELECT * FROM Orders WHERE Customer.Cust_id = Orders.Cust_id );
A consulta acima retornará o nome e a ocupação de todos os clientes que fizeram pelo menos um pedido.
Saída:
Nome | Ocupação |
Harry | Engenheiro |
Rony | Desenvolvedor |
Dobby | Líder |
Alvo | Cientista |
Gengibre | Ator |
Tabela de diferenças entre o operador IN e EXISTS
As principais diferenças entre o operador IN e o operador EXISTS estão listadas abaixo de forma tabular:
Operador IN | Operador EXISTS |
Minimiza o uso das condições OR. | Verifica a existência de um registro na consulta interna. |
Ele compara os valores da consulta interna com o valor da consulta externa. | Não compara os valores entre a consulta interna e a subconsulta. |
Verifica todos os valores dentro do bloco da cláusula IN. | Ele interrompe qualquer execução adicional assim que a primeira condição verdadeira for atendida. |
Pode retornar VERDADEIRO, FALSO ou NULO. | Ele retorna VERDADEIRO ou FALSO. |
Pode ser usado para verificar valores NULL. | Não pode ser usado para verificar valores NULL. |
É usado com subconsultas e valores. | É usado apenas com subconsultas. |
A execução é mais rápida quando o resultado da consulta interna é menor. | A execução é mais rápida mesmo quando o resultado da consulta interna é grande. É mais eficiente que o operador IN. |
Sintaxe :SELECT column_names FROM table_name WHERE column_name IN (subconsulta); | Sintaxe :SELECT column_namesFROM table_nameWHERE [NOT] EXISTS (subconsulta); |
Conclusão:
Neste tópico, foi feita uma comparação entre o operador IN e os operadores EXISTS do SQL. Ambos os operadores fazem a mesma operação, mas seu funcionamento interno é diferente. Eles têm um funcionamento lógico diferente. Qualquer um deles pode ser selecionado de acordo com a exigência. Mas, se o conjunto de dados for grande, é sempre recomendável usar o operador EXISTS.