Os operadores IN e NOT IN são utilizados para verificar se um valor pertence ou não a uma lista de valores ou ao resultado de uma subconsulta.
Eles facilitam filtros que precisariam de vários operadores OR.
O operador IN retorna registros quando o valor informado está dentro da lista definida.
SELECT *
FROM clientes
WHERE cidade IN
('São Paulo',
'Rio de Janeiro',
'Curitiba');
O mesmo resultado poderia ser escrito assim:
SELECT *
FROM clientes
WHERE cidade = 'São Paulo'
OR cidade = 'Rio de Janeiro'
OR cidade = 'Curitiba';
O IN deixa a consulta mais organizada.
CLIENTES
+----+----------+-------------+
| ID | Nome | Cidade |
+----+----------+-------------+
| 1 | Ana | São Paulo |
| 2 | Carlos | Curitiba |
| 3 | Pedro | Salvador |
| 4 | Maria | Rio Janeiro |
+----+----------+-------------+
SELECT nome
FROM clientes
WHERE cidade IN
('São Paulo',
'Curitiba');
Resultado:
Ana
Carlos
O IN também pode receber o resultado de outra consulta.
SELECT nome
FROM clientes
WHERE id IN
(
SELECT cliente_id
FROM pedidos
);
Retorna clientes que possuem pedidos cadastrados.
O NOT IN retorna registros que não pertencem à lista informada.
SELECT *
FROM clientes
WHERE cidade NOT IN
('São Paulo',
'Curitiba');
Pedro
Maria
SELECT nome
FROM clientes
WHERE id NOT IN
(
SELECT cliente_id
FROM pedidos
);
Retorna clientes que nunca realizaram pedidos.
| IN | NOT IN |
|---|---|
| Busca valores existentes | Busca valores ausentes |
| Equivale a vários OR | Equivale a exclusões |
| Inclui registros selecionados | Remove registros selecionados |
O NOT IN pode apresentar resultados inesperados quando a subconsulta retorna valores NULL.
SELECT nome
FROM clientes
WHERE id NOT IN
(
SELECT cliente_id
FROM pedidos
);
Caso cliente_id possua NULL, o resultado pode não ser o esperado.
| IN | EXISTS |
|---|---|
| Compara valores | Verifica existência |
| Retorna uma lista | Retorna verdadeiro ou falso |
| Útil para pequenos conjuntos | Melhor em grandes volumes |
| Sistema | Exemplo |
|---|---|
| E-commerce | Produtos de determinadas categorias |
| RH | Funcionários de setores específicos |
| Financeiro | Transações selecionadas |
| Relatórios | Filtros avançados |
| Erro | Problema |
|---|---|
| Usar NOT IN com NULL | Resultado incorreto |
| Lista muito grande | Baixo desempenho |
| Comparar tipos diferentes | Erro na consulta |
| Subconsulta sem índice | Consulta lenta |