Como buscar registros que existem em uma tabela, mas não em outra?

Podemos encontrar registros presentes em uma tabela, mas não em outra, utilizando LEFT JOIN, NOT EXISTS ou NOT IN.

Como buscar registros que existem em uma tabela, mas não em outra?

Em SQL, podemos precisar listar registros que estão presentes em uma tabela, mas não possuem correspondência em outra. Isso é útil para encontrar clientes sem pedidos, produtos sem vendas, usuários sem atividade, entre outros casos.

Usando LEFT JOIN com WHERE NULL

A maneira mais comum de resolver isso é utilizando LEFT JOIN e filtrando os valores NULL:

SELECT clientes.nome 
FROM clientes 
LEFT JOIN pedidos ON clientes.id = pedidos.cliente_id 
WHERE pedidos.id IS NULL;

Aqui, estamos listando clientes que nunca fizeram pedidos.

Usando NOT EXISTS

Outra alternativa é utilizar NOT EXISTS para verificar a ausência de registros na segunda tabela:

SELECT nome 
FROM clientes c 
WHERE NOT EXISTS (
    SELECT 1 FROM pedidos p WHERE p.cliente_id = c.id
);

Isso retorna clientes que não têm pedidos registrados.

Usando NOT IN

Podemos também utilizar NOT IN, embora essa abordagem possa ser menos eficiente em grandes bases de dados:

SELECT nome 
FROM clientes 
WHERE id NOT IN (SELECT cliente_id FROM pedidos);

Isso retorna o mesmo resultado, mas em tabelas grandes pode ser mais lento do que LEFT JOIN ou NOT EXISTS.

Qual abordagem usar?

Método Melhor para
LEFT JOIN + WHERE NULL Melhor desempenho em grandes bases com índice
NOT EXISTS Boa alternativa para evitar valores NULL
NOT IN Menos eficiente, evitar em bases grandes

Cuidados ao buscar registros não correspondentes

  • LEFT JOIN pode ser mais rápido se houver índices adequados nas colunas de junção.
  • NOT IN pode ser problemático se a subconsulta retornar valores NULL.
  • O uso de índices é fundamental para otimizar essas consultas e evitar lentidão.

Encontrar registros que existem em uma tabela, mas não em outra, é uma necessidade comum em bancos de dados relacionais. Por exemplo, em um sistema de e-commerce, pode ser útil listar produtos cadastrados que nunca foram vendidos. Já em um CRM, pode-se identificar clientes que nunca fizeram uma compra. A escolha entre LEFT JOIN, NOT EXISTS e NOT IN deve levar em consideração o tamanho das tabelas e a presença de índices, garantindo que a consulta seja eficiente mesmo em bases de dados grandes.

Algumas aplicações:

  • Encontrar clientes sem compras registradas
  • Listar produtos sem vendas
  • Identificar funcionários sem atribuições
  • Filtrar usuários sem atividade em um período
  • Descobrir pedidos sem pagamentos registrados

Dicas para quem está começando

  • Use LEFT JOIN com WHERE NULL para melhor performance
  • Evite NOT IN em tabelas grandes, pois pode ser mais lento
  • Certifique-se de que a coluna usada no filtro está indexada
  • Teste diferentes abordagens e analise o tempo de execução
  • Se houver valores NULL na segunda tabela, prefira NOT EXISTS

Contribuições de Rodrigo Martins

Compartilhe este tutorial: Como buscar registros que existem em uma tabela, mas não em outra?

Compartilhe este tutorial

Continue aprendendo:

Como usar CROSS JOIN no SQL?

O CROSS JOIN no SQL combina todos os registros de duas tabelas, gerando o produto cartesiano entre elas.

Tutorial anterior

Como excluir registros de uma tabela baseando-se em outra tabela?

Podemos excluir registros de uma tabela baseando-se em outra utilizando DELETE com JOIN, NOT EXISTS ou NOT IN no SQL.

Próximo tutorial