🧱 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
WHEREe noON -
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):
📘 Perceba que o produto 13 (Webcam) não existe na tabela secundária.
🧩 Consulta 1 — LEFT JOIN normal
🟢 Resultado esperado:
| id_produto | nome_produto | preco |
|---|---|---|
| 10 | Teclado | 150.00 |
| 11 | Mouse | 80.00 |
| 12 | Monitor | 900.00 |
| 13 | Webcam | NULL |
✅ 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)
🟡 Resultado:
| id_produto | nome_produto | preco |
|---|---|---|
| 12 | Monitor | 900.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)
🟢 Resultado:
| id_produto | nome_produto | preco |
|---|---|---|
| 10 | Teclado | NULL |
| 11 | Mouse | NULL |
| 12 | Monitor | 900.00 |
| 13 | Webcam | NULL |
💬 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.