Semântica de RIGHT e FULL OUTER JOIN
Saiba quando cada um é necessário e como reescrever RIGHT como LEFT.
Semântica de RIGHT e FULL OUTER JOIN é uma aula grátis de Coding 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
Além de LEFT JOIN
Depois que você entende LEFT JOIN, os entrevistadores testam a imagem espelhada e a união das duas: RIGHT JOIN e FULL OUTER JOIN.
- RIGHT JOIN preserva todas as linhas da tabela à direita.
- FULL OUTER JOIN preserva as linhas sem correspondência de ambas as tabelas.
Esta lição define cada uma com precisão e mostra o truque de reescrita que os entrevistadores adoram: qualquer RIGHT JOIN pode se tornar uma LEFT JOIN.
Definição de RIGHT JOIN
Uma RIGHT JOIN (ou RIGHT OUTER JOIN) mantém todas as linhas da tabela à direita, aquela escrita depois da palavra-chave JOIN. As linhas direitas sem correspondência aparecem com NULL nas colunas da tabela à esquerda.
É o espelho exato de LEFT JOIN. Enquanto LEFT preserva a tabela mencionada primeiro, RIGHT preserva a mencionada em segundo lugar.
SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c
ON o.customer_id = c.id;
-- keeps ALL customers, even those
-- with no order (Carol -> amount NULL)As tabelas novamente
Os mesmos dados de antes. Carol (cliente 3) não tem pedidos. Aqui, todas as linhas de pedidos fazem referência a um cliente existente; portanto, quando clientes são o lado preservado, nenhum pedido fica órfão.
-- customers orders
-- 1 | Alice 10 | 1 | 50
-- 2 | Bob 11 | 1 | 75
-- 3 | Carol 12 | 2 | 20Reescrevendo RIGHT como LEFT
A conclusão importante para a entrevista: RIGHT JOIN é raramente usada na prática, porque você sempre pode inverter a ordem das tabelas e usar uma LEFT JOIN. As duas consultas abaixo são logicamente idênticas.
Muitos guias de estilo proíbem RIGHT JOIN por completo, porque ler da esquerda para a direita e sempre preservar a tabela à esquerda é mais fácil de entender.
-- RIGHT JOIN
SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c ON o.customer_id = c.id;
-- Equivalent LEFT JOIN (preferred)
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;Definição de FULL OUTER JOIN
O FULL OUTER JOIN mantém as linhas sem correspondência de ambas as tabelas. Pense nele como uma LEFT JOIN e uma RIGHT JOIN combinadas:
- Pares correspondentes aparecem normalmente.
- Linhas esquerdas sem correspondência: colunas direitas NULL.
- Linhas direitas sem correspondência: colunas esquerdas NULL.
Ele responde a "mostre tudo dos dois lados, alinhando as correspondências".
SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o
ON o.customer_id = c.id;Quando FULL OUTER se destaca
FULL OUTER JOIN é a opção ideal para reconciliação: comparar dois conjuntos de dados que deveriam coincidir, mas talvez não coincidam.
Imagine uma tabela orders e uma tabela payments separada. Uma FULL OUTER JOIN pelo identificador do pedido revela, em um único resultado, os pedidos sem pagamento e os pagamentos sem um pedido correspondente, cada um identificado por valores NULL no lado ausente.
SELECT o.id AS order_id, p.id AS payment_id
FROM orders o
FULL OUTER JOIN payments p
ON p.order_id = o.id
WHERE o.id IS NULL OR p.id IS NULL;
-- rows where one side is missingConsciência dos dialetos
Um entrevistador pode avaliar seu conhecimento sobre portabilidade. MySQL não possui a palavra-chave FULL OUTER JOIN (até a versão 8). Postgres, SQL Server e Oracle oferecem suporte a ela.
No MySQL, você pode simular esse comportamento combinando um LEFT JOIN e um RIGHT JOIN com UNION (que remove as linhas correspondentes duplicadas). Conhecer essa diferença demonstra experiência prática.
-- FULL OUTER JOIN emulated in MySQL
SELECT c.name, o.id FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.name, o.id FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;Os quatro tipos de JOIN em resumo
Mantenha esta tabela em mente. "Preservada" significa que as linhas sem correspondência permanecem com valores NULL.
- INNER JOIN: apenas linhas correspondentes. Nada é preservado.
- LEFT JOIN: todas as linhas da esquerda são preservadas.
- RIGHT JOIN: todas as linhas da direita são preservadas.
- FULL OUTER JOIN: ambos os lados são preservados.
Toda pergunta de entrevista sobre junções externas se resume a escolher qual lado, ou quais lados, preservar.
Escolhendo entre elas
Escolha a junção perguntando: "quais linhas sem correspondência preciso manter?"
- Manter apenas as linhas da tabela principal: LEFT JOIN (coloque a tabela principal primeiro).
- Precisar dos dois conjuntos sem correspondência para uma reconciliação: FULL OUTER JOIN.
- Importarem apenas as correspondências: INNER JOIN.
Quase nunca se escolhe RIGHT JOIN diretamente; reformule a consulta como LEFT JOIN.
Um exemplo de reconciliação
Use FULL OUTER JOIN para rotular o status de cada linha. CASE aplicado ao padrão de NULL informa qual lado está ausente, como na consulta clássica de auditoria.
SELECT
COALESCE(o.id, p.order_id) AS ord,
CASE
WHEN p.id IS NULL THEN 'no payment'
WHEN o.id IS NULL THEN 'orphan payment'
ELSE 'matched'
END AS status
FROM orders o
FULL OUTER JOIN payments p ON p.order_id = o.id;Equívoco comum
Os candidatos muitas vezes pensam que FULL OUTER JOIN retorna o produto cartesiano das linhas sem correspondência. Isso não acontece. As linhas sem correspondência de cada lado aparecem exatamente uma vez, acompanhadas de NULL, e nunca são multiplicadas umas pelas outras.
As linhas correspondentes ainda seguem a multiplicação normal da junção (uma linha de saída por par correspondente), a mesma regra de expansão de qualquer junção.
Verificação rápida
Um entrevistador pede que você reescreva uma consulta para uma equipe que proíbe RIGHT JOIN.
Recapitulação
RIGHT JOIN preserva a tabela da direita; FULL OUTER JOIN preserva ambas. Qualquer RIGHT JOIN pode ser reescrito como LEFT JOIN trocando a ordem das tabelas, por isso as equipes preferem LEFT.
- FULL OUTER é ideal para reconciliar dois conjuntos de dados.
- MySQL não possui FULL OUTER; simule-o com LEFT + RIGHT +
UNION. - Escolha uma junção decidindo quais linhas sem correspondência manter.
- As linhas sem correspondência aparecem uma vez com NULL, nunca como um produto cartesiano.
Perguntas Frequentes
A aula “Semântica de RIGHT e FULL OUTER JOIN” é grátis?
Sim — o texto completo de “Semântica de RIGHT e FULL OUTER JOIN” é 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “Semântica de RIGHT e FULL OUTER JOIN”?
Saiba quando cada um é necessário e como reescrever RIGHT como LEFT. Você pratica Coding 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 Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding 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 “Semântica de RIGHT e FULL OUTER JOIN”?
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 Coding Interview Prep?
Sim. Cada aula de Coding 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