LEFT JOIN e preservação de linhas sem correspondência
Veja o que LEFT JOIN preserva e como NULLs aparecem nas linhas sem correspondência.
LEFT JOIN e preservação de linhas sem correspondência é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 1 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.
A situação da entrevista
Um entrevistador diz: "Liste todos os clientes e seus pedidos, incluindo os clientes que nunca fizeram pedidos." Uma INNER JOIN elimina os clientes sem pedidos, portanto não atende a esse requisito. A solução é usar LEFT JOIN.
Uma LEFT JOIN mantém todas as linhas da tabela à esquerda (a primeira mencionada) e associa as linhas correspondentes da tabela à direita quando elas existem. Esta lição desenvolve o modelo mental preciso que os entrevistadores esperam.
O que LEFT JOIN garante
A promessa central: todas as linhas da tabela à esquerda aparecem na saída pelo menos uma vez, tenham correspondência ou não.
- Se uma linha à esquerda encontrar correspondências à direita, você obterá uma linha de saída para cada correspondência.
- Se uma linha à esquerda não encontrar correspondência, você ainda obterá uma linha de saída, com todas as colunas da tabela à direita definidas como
NULL.
É por isso que os entrevistadores chamam esse tipo de junção de outer: as linhas que ficam fora do conjunto de correspondências são preservadas, em vez de descartadas.
As duas tabelas
Ao longo desta lição, usamos duas tabelas simples. customers contém todos os clientes; orders registra as compras e faz referência a um cliente por meio de customer_id.
Observe que o cliente 3 (Carol) não tem nenhuma linha em orders. Esse cliente sem correspondência é exatamente o que uma LEFT JOIN deve preservar.
-- customers
-- id | name
-- 1 | Alice
-- 2 | Bob
-- 3 | Carol
-- orders
-- id | customer_id | amount
-- 10 | 1 | 50
-- 11 | 1 | 75
-- 12 | 2 | 20Escrevendo a LEFT JOIN
A sintaxe é semelhante à de uma junção interna, substituindo INNER por LEFT (a palavra OUTER é opcional: LEFT JOIN e LEFT OUTER JOIN são idênticas).
A tabela escrita antes da palavra-chave é o lado esquerdo preservado. A ordem importa: customers LEFT JOIN orders mantém todos os clientes, não todos os pedidos.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id;Lendo o resultado
Esta é a saída daquela consulta. Alice teve duas correspondências, então aparece duas vezes. Bob teve uma correspondência. Carol não teve nenhuma correspondência, portanto ainda aparece com NULL na coluna amount.
Essa única linha de Carol com NULL é a marca característica de uma LEFT JOIN. Um entrevistador que observa seu raciocínio em voz alta quer ouvir: "as linhas esquerdas sem correspondência permanecem, com valores NULL à direita".
-- name | amount
-- Alice | 50
-- Alice | 75
-- Bob | 20
-- Carol | NULL <-- preserved, no matchDe onde vêm os NULLs
O valor NULL não é armazenado em lugar algum. O banco de dados o sintetiza porque não existe uma linha da tabela à direita para fornecer amount.
Todas as colunas obtidas da tabela à direita se tornam NULL para uma linha esquerda sem correspondência: o.id, o.customer_id e o.amount são todos NULL na linha de Carol. Isso é importante porque o.customer_id ser NULL não significa que o cliente não tem identificador; significa que não houve nenhum pedido correspondente.
Contando pedidos por cliente
Uma pergunta complementar comum: "Quantos pedidos cada cliente tem, incluindo os que têm zero?" Uma LEFT JOIN com COUNT resolve perfeitamente, mas você precisa contar a coluna da tabela à direita, não *.
COUNT(o.id) ignora valores NULL, portanto Carol obtém 0. COUNT(*) retornaria incorretamente 1 para Carol, porque a linha NULL sintetizada ainda conta como uma linha.
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob | 1
-- Carol | 0Armadilha de COUNT(*) versus COUNT(coluna)
Esta é uma armadilha clássica de entrevistas. Depois de uma LEFT JOIN, a linha esquerda sem correspondência existe fisicamente no resultado, com colunas NULL à direita.
COUNT(*)conta essa linha, retornando 1 para um cliente sem pedidos.COUNT(o.id)ignora o valor NULL, retornando corretamente 0.
Sempre conte uma coluna que seja NULL no lado sem correspondência quando precisar de zeros verdadeiros.
-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;Somando com LEFT JOIN
Agregações além de COUNT lidam bem com os valores NULL sintetizados. SUM ignora valores NULL, portanto um cliente sem correspondência produz NULL (não um erro).
Os entrevistadores geralmente querem zero em vez de NULL nos relatórios. Envolva a agregação em COALESCE para substituir o resultado por um valor padrão.
SELECT c.name,
COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob | 20
-- Carol | 0Tabela esquerda versus direita, de forma clara
Quando um entrevistador perguntar "qual tabela é preservada?", responda com confiança: a que está à esquerda da palavra-chave JOIN. Leia da esquerda para a direita.
A LEFT JOIN B = mantém tudo de A. Para manter tudo de B, você pode inverter para B LEFT JOIN A ou usar uma RIGHT JOIN. A maioria das equipes prefere usar exclusivamente LEFT JOIN por questões de legibilidade, simplesmente reordenando as tabelas.
Uma lista mental de verificação
Quando vir uma LEFT JOIN em uma entrevista, percorra esta lista em voz alta:
- Lado preservado? A tabela à esquerda; todas as linhas são mantidas.
- Linhas sem correspondência? Aparecem uma vez, com valores NULL da tabela à direita.
- Contagem? Use
COUNT(right_col)para obter zeros verdadeiros. - Soma? Envolva-a em
COALESCEse precisar de 0, e não de NULL.
Expressar essa lista em voz alta demonstra rigor de nível sênior.
Verificação rápida
Teste sua intuição sobre LEFT JOIN ao fazer contagens.
Recapitulação
LEFT JOIN preserva todas as linhas da tabela à esquerda. As linhas esquerdas com correspondência são associadas às correspondências direitas; as linhas esquerdas sem correspondência permanecem uma vez, com NULL em todas as colunas da tabela à direita.
- A tabela à esquerda é a que aparece antes da palavra-chave
JOIN. - Valores NULL sintetizados indicam as linhas sem correspondência.
COUNT(right_col)fornece zeros verdadeiros;COUNT(*)não.COALESCE(SUM(...), 0)transforma totais NULL em zero.
Esta é a base para encontrar dados ausentes e fazer anti-junções nas próximas lições.
Perguntas Frequentes
A aula “LEFT JOIN e preservação de linhas sem correspondência” é grátis?
Sim — o texto completo de “LEFT JOIN e preservação de linhas sem correspondência” é 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 “LEFT JOIN e preservação de linhas sem correspondência”?
Veja o que LEFT JOIN preserva e como NULLs aparecem nas linhas sem correspondência. 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 1 de 4.
Quanto tempo leva a aula “LEFT JOIN e preservação de linhas sem correspondência”?
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
- LEFT JOIN e preservação de linhas sem correspondência
- Semântica de RIGHT e FULL OUTER JOIN
- Encontrando linhas sem correspondência (anti-junção)
- A armadilha de WHERE em junções externas