📑 Tabela de Conteúdo

LEFT JOIN com filtro WHERE vs ON: entenda de uma vez por todas com exemplos práticos em SQL

 🧱 Introdução

Um dos temas mais confusos em SQL é o comportamento do LEFT JOIN quando usamos filtros.
Muita gente não percebe que a posição da condição (WHERE ou ON) muda completamente o resultado da consulta.

Neste artigo, você vai aprender:

  • A diferença entre aplicar o filtro no WHERE e no ON

  • Como preservar os registros da tabela principal

  • Exemplos práticos com tabelas de teste

  • Explicação visual com imagens do resultado


⚙️ Cenário de teste — criando o ambiente

Você pode rodar este script em SQL Server, PostgreSQL ou Oracle (ajusta só o CREATE TABLE se quiser):

-- Criando tabelas CREATE TABLE TABELA_PRINCIPAL ( id_produto INT PRIMARY KEY, nome_produto VARCHAR(50) ); CREATE TABLE TABELA_SECUNDARIA ( id_produto INT, preco DECIMAL(10,2) ); -- Inserindo dados na tabela principal INSERT INTO TABELA_PRINCIPAL (id_produto, nome_produto) VALUES (10, 'Teclado'), (11, 'Mouse'), (12, 'Monitor'), (13, 'Webcam'); -- Inserindo dados na tabela secundária INSERT INTO TABELA_SECUNDARIA (id_produto, preco) VALUES (10, 150.00), (11, 80.00), (12, 900.00);

📘 Perceba que o produto 13 (Webcam) não existe na tabela secundária.


🧩 Consulta 1 — LEFT JOIN normal

SELECT p.id_produto, p.nome_produto, s.preco FROM TABELA_PRINCIPAL p LEFT JOIN TABELA_SECUNDARIA s ON p.id_produto = s.id_produto;

🟢 Resultado esperado:

id_produtonome_produtopreco
10Teclado150.00
11Mouse80.00
12Monitor900.00
13WebcamNULL

✅ Todos os registros da tabela principal aparecem,
mesmo sem correspondência na secundária (Webcam → NULL).


🚫 Consulta 2 — Filtro no WHERE (perde o comportamento do LEFT JOIN)

SELECT p.id_produto, p.nome_produto, s.preco FROM TABELA_PRINCIPAL p LEFT JOIN TABELA_SECUNDARIA s ON p.id_produto = s.id_produto WHERE s.id_produto = 12;

🟡 Resultado:

id_produtonome_produtopreco
12Monitor900.00

💬 Explicação:
Ao colocar s.id_produto = 12 no WHERE, o SQL ignora as linhas onde s é NULL.
O LEFT JOIN perde o sentido e o resultado fica igual a um INNER JOIN filtrado.


✅ Consulta 3 — Filtro dentro do ON (mantém o comportamento do LEFT JOIN)

SELECT p.id_produto, p.nome_produto, s.preco FROM TABELA_PRINCIPAL p LEFT JOIN TABELA_SECUNDARIA s ON p.id_produto = s.id_produto AND s.id_produto = 12;

🟢 Resultado:

id_produtonome_produtopreco
10TecladoNULL
11MouseNULL
12Monitor900.00
13WebcamNULL

💬 Explicação:
Agora sim!
Todos os produtos da tabela principal aparecem.
Apenas o produto 12 traz dados da tabela secundária; os outros permanecem com NULL.

✝ Copyright © Blog do KDS - Isaías 40:5 “A glória do Senhor se manifestará, e toda a humanidade a verá.”