0Pricing
SQL Interview Prep · Aula

ON versus WHERE em junções

Saiba quando um predicado pertence a ON ou a WHERE e por que isso importa para os resultados.

ON versus WHERE em junções é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

Um predicado pode estar em dois lugares

Depois de conseguir escrever um INNER JOIN, a próxima pergunta de entrevista é mais precisa: essa condição pertence a ON ou a WHERE?

Para um INNER JOIN, a resposta muitas vezes é "o resultado não muda". Mas, assim que você muda para uma junção externa, a escolha muda completamente a resposta. Os entrevistadores fazem essa pergunta justamente porque profissionais iniciantes colocam tudo em WHERE por hábito.

Esta lição torna a regra clara.

O que ON faz

A cláusula ON define como as linhas são emparelhadas. Ela é aplicada enquanto a junção é construída, decidindo qual linha da tabela à esquerda corresponde a qual linha da tabela à direita.

Pense em ON como a resposta à pergunta: "para estas duas linhas, elas pertencem uma à outra?"

SELECT c.name, o.amount
FROM customers c
JOIN orders o
  ON o.customer_id = c.id;   -- pairing rule

O que WHERE faz

A cláusula WHERE é aplicada depois que a junção produz suas linhas combinadas. Ela filtra esse conjunto de resultados, descartando as linhas que não passam no teste.

Pense em WHERE como a resposta à pergunta: "agora que tenho as linhas combinadas, quais delas quero manter?"

SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;   -- filter after pairing

No INNER JOIN, eles geralmente dão o mesmo resultado

Em um INNER JOIN, um filtro adicional produz o mesmo resultado, esteja ele em ON ou em WHERE. As duas consultas abaixo retornam apenas o pedido de US$ 50 de Ada e o pedido de US$ 99 de Bob.

Como as linhas sem correspondência já são descartadas por uma junção interna, mover o predicado não muda quais linhas permanecem.

-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;

-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;

Por que o estilo ainda prefere ON para as chaves da junção

Mesmo quando os resultados coincidem, a convenção recomenda: coloque as condições da relação da junção em ON e os filtros de negócio em WHERE.

  • ON: o.customer_id = c.id (como as tabelas se relacionam)
  • WHERE: o.amount > 30 (quais resultados você quer)

Essa separação torna a intenção evidente para o próximo leitor e para o entrevistador que avalia seu estilo.

Onde isso realmente importa: junções externas

A distinção se torna decisiva com um LEFT JOIN, que mantém todas as linhas da esquerda mesmo quando nenhuma linha da direita corresponde. Veja uma prévia rápida usando clientes e pedidos, em que Cleo não tem pedidos.

Um LEFT JOIN mantém Cleo com NULL nas colunas de pedidos. Agora observe o que ON e WHERE fazem com ela.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)

Filtro em ON: as linhas são preservadas

Coloque a condição amount > 30 em ON de um LEFT JOIN, e ela afetará apenas quais linhas da direita serão anexadas. As linhas da esquerda sem correspondência ainda serão mantidas, apenas com NULLs.

Cleo permanece. Qualquer pedido que não passe no teste simplesmente não é anexado, deixando um NULL.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL  (3 rows, Cleo kept)

Filtro em WHERE: a junção externa desaparece

Mova a mesma condição para WHERE e você filtrará o resultado da junção. A linha de Cleo tem amount = NULL, e NULL > 30 não é verdadeiro, portanto ela é removida.

O LEFT JOIN se comporta silenciosamente como um INNER JOIN. Esta é a mais famosa armadilha de junções em entrevistas.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99  (Cleo GONE -> back to inner-join behavior)

A regra para memorizar

Exponha isso claramente em uma entrevista:

  • Uma condição em ON decide se a linha da direita será anexada; as linhas da esquerda são preservadas.
  • Uma condição em WHERE filtra as linhas finais e pode eliminar linhas preservadas da esquerda quando envolve uma coluna que pode conter NULL.

Portanto, em junções externas: os predicados da tabela opcional devem ficar em ON, a menos que você queira deliberadamente remover as linhas sem correspondência.

O uso legítimo de WHERE com NULL

Existe um caso em que filtrar uma coluna de uma junção externa em WHERE é exatamente o correto: a anti-junção. Testar IS NULL encontra as linhas da esquerda que não tiveram correspondência.

Aqui, WHERE mantém deliberadamente apenas as linhas sem correspondência, retornando os clientes com zero pedidos. A mesma mecânica, com intenção oposta.

SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;   -- customers with no orders -> Cleo

Teste mental rápido

Antes do questionário, use esta lista de verificação ao encontrar uma condição de junção:

  • É uma chave de junção que relaciona as tabelas? -> ON.
  • É um filtro na tabela obrigatória? -> WHERE ou ON; ambos funcionam.
  • É um filtro na tabela opcional (externa), e você quer manter as linhas sem correspondência? -> ON.
  • Você quer encontrar as não correspondências? -> WHERE ... IS NULL.

Verificação rápida

Aplique a regra ON versus WHERE a uma junção externa.

Recapitulação: ON vs. WHERE

Pontos principais para levar à entrevista:

  • ON controla o emparelhamento e, nas junções externas, determina se a linha opcional será anexada, preservando o lado mantido.
  • WHERE filtra o resultado já combinado e pode remover linhas preservadas.
  • Em um INNER JOIN, os dois são frequentemente intercambiáveis; em junções externas, não.
  • Os filtros na tabela externa devem ficar em ON, a menos que você queira uma anti-junção com IS NULL em WHERE.

Perguntas Frequentes

A aula “ON versus WHERE em junções” é grátis?

Sim — o texto completo de “ON versus WHERE em junções” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.

O que vou aprender em “ON versus WHERE em junções”?

Saiba quando um predicado pertence a ON ou a WHERE e por que isso importa para os resultados. Você pratica SQL Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Interview Prep?

Nenhuma experiência prévia é necessária. SQL Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “ON versus WHERE em junções”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Interview Prep?

Sim. Cada aula de SQL Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Como INNER JOIN faz correspondência entre linhas
  2. ON versus WHERE em junções
  3. Expansão de junções e multiplicação de linhas
  4. Unindo três ou mais tabelas
← Voltar para SQL Interview Prep