INNER JOIN, LEFT JOIN e RIGHT JOIN: como relacionar tabelas no SQL

Entenda de forma simples como funcionam INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN para combinar dados de várias tabelas no SQL.

Compartilhar no Linkedin Compartilhar no WhatsApp

Tempo estimado de leitura: 8 minutos

Imagem do artigo INNER JOIN, LEFT JOIN e RIGHT JOIN: como relacionar tabelas no SQL

Em um banco de dados bem estruturado, a informação raramente mora em uma única tabela. Clientes ficam em um lugar, pedidos em outro, produtos em um terceiro. Para responder perguntas do tipo “quais clientes compraram no último mês?”, é preciso juntar essas tabelas — e é exatamente para isso que existem os JOINs no SQL.

Este guia explica, de forma didática, o que cada tipo de JOIN faz, quando usar cada um e como evitar os erros mais comuns de quem está começando.

Por que as tabelas são separadas?

Separar os dados em tabelas distintas é uma consequência direta da normalização: cada assunto tem sua própria tabela, e as tabelas se conectam por meio de chaves. A tabela clientes tem uma chave primária (id), e a tabela pedidos guarda uma chave estrangeira (cliente_id) apontando para ela.

Isso evita repetição de informação e mantém o banco consistente. O preço a pagar é que, na hora de consultar, você precisa reunir novamente o que foi separado. O JOIN é a ferramenta que faz essa reunião.

A estrutura básica de um JOIN

Todo JOIN segue o mesmo esqueleto: você indica a tabela da esquerda, o tipo de junção, a tabela da direita e a condição que liga as duas.

SELECT c.nome, p.data_pedido, p.valor
FROM clientes AS c
INNER JOIN pedidos AS p
  ON c.id = p.cliente_id;

A cláusula ON é o coração da operação: ela diz ao banco como as linhas de uma tabela correspondem às linhas da outra. Sem uma condição adequada, o resultado sai errado ou gigantesco.

INNER JOIN: só o que existe dos dois lados

O INNER JOIN retorna apenas as linhas em que a condição é satisfeita em ambas as tabelas. É o tipo mais usado no dia a dia.

Se um cliente nunca fez pedido nenhum, ele simplesmente não aparece no resultado. Se existe um pedido cujo cliente_id não corresponde a nenhum cliente cadastrado, esse pedido também some. O INNER JOIN é, portanto, uma interseção.

Use INNER JOIN quando a pergunta pressupõe a existência dos dois lados: “liste os pedidos com o nome do cliente que os fez”.

LEFT JOIN: tudo da esquerda, o que houver da direita

O LEFT JOIN (ou LEFT OUTER JOIN) preserva todas as linhas da tabela da esquerda, mesmo que não haja correspondência na direita. Quando não há par, as colunas da tabela da direita vêm preenchidas com NULL.

SELECT c.nome, p.data_pedido
FROM clientes AS c
LEFT JOIN pedidos AS p
  ON c.id = p.cliente_id;

Aqui, todos os clientes aparecem — inclusive os que nunca compraram, com data_pedido nula. Isso torna o LEFT JOIN perfeito para encontrar ausências:

SELECT c.nome
FROM clientes AS c
LEFT JOIN pedidos AS p
  ON c.id = p.cliente_id
WHERE p.id IS NULL;

Essa consulta devolve exatamente os clientes sem nenhum pedido — uma lista muito útil para campanhas de reativação.

RIGHT JOIN: o espelho do LEFT JOIN

O RIGHT JOIN faz o oposto: mantém todas as linhas da tabela da direita e completa com NULL o que faltar da esquerda. Do ponto de vista lógico, ele é redundante — basta inverter a ordem das tabelas e usar LEFT JOIN.

Na prática, a maioria das equipes padroniza o uso do LEFT JOIN, porque ler consultas sempre no mesmo sentido (da esquerda para a direita) reduz erros. Ainda assim, é importante reconhecer o RIGHT JOIN quando aparecer em código de terceiros.

FULL JOIN e CROSS JOIN

O FULL JOIN (ou FULL OUTER JOIN) combina os dois comportamentos: traz todas as linhas das duas tabelas, preenchendo com NULL onde não há correspondência. É útil em tarefas de conciliação, quando você precisa enxergar registros órfãos dos dois lados. Vale notar que nem todos os bancos oferecem FULL JOIN nativamente — o MySQL, por exemplo, historicamente não o implementa, e o efeito é obtido combinando dois LEFT JOINs com UNION.

Já o CROSS JOIN não usa condição alguma: ele produz o produto cartesiano, combinando cada linha da primeira tabela com cada linha da segunda. Duas tabelas de 1.000 linhas geram um milhão de resultados. Existe uso legítimo (gerar combinações, como todos os tamanhos de todas as cores), mas ele também aparece por acidente quando alguém esquece a cláusula ON.

Resumo comparativo

TipoO que retornaUso típico
INNER JOINSó as linhas com correspondência nas duas tabelasRelatórios em que os dois lados são obrigatórios
LEFT JOINTodas da esquerda + as correspondentes da direitaListar registros mesmo sem dados relacionados
RIGHT JOINTodas da direita + as correspondentes da esquerdaEquivalente ao LEFT com as tabelas invertidas
FULL JOINTodas as linhas das duas tabelasConciliação e auditoria de dados
CROSS JOINTodas as combinações possíveisGerar matrizes de combinações

Erros comuns de quem está começando

  • Filtrar a tabela da direita no WHERE em um LEFT JOIN. Uma condição como WHERE p.status = 'pago' descarta as linhas com NULL e transforma o LEFT JOIN em INNER JOIN. Se o filtro faz parte da junção, ele deve ir na cláusula ON.
  • Esquecer a condição ON. O resultado vira um produto cartesiano e a consulta pode travar o servidor.
  • Juntar por colunas que não são chaves. Isso multiplica linhas silenciosamente e infla somas e contagens.
  • Não usar apelidos (aliases). Em consultas com três ou mais tabelas, apelidos curtos deixam o código legível e evitam ambiguidade de nomes de colunas.
  • Ignorar índices. Colunas usadas em condições de junção devem estar indexadas; sem isso, o desempenho cai drasticamente conforme a tabela cresce.

Como praticar

A melhor forma de fixar JOINs é criar duas ou três tabelas pequenas, com poucas linhas, e rodar cada tipo de junção observando a diferença no resultado. Com dez linhas por tabela, dá para conferir o resultado no olho e entender exatamente o que o banco está fazendo. Só depois vale partir para bases maiores e para consultas com múltiplas junções encadeadas.

Outro exercício valioso é reescrever a mesma pergunta de duas maneiras diferentes — por exemplo, com LEFT JOIN e depois com subconsulta — e comparar os resultados e o plano de execução. Isso desenvolve a intuição sobre o que é mais eficiente em cada caso.

Conclusão

Dominar JOINs é o que separa quem consegue extrair só listas simples de quem consegue responder perguntas reais de negócio a partir do banco de dados. INNER JOIN para interseções, LEFT JOIN para incluir os ausentes, FULL JOIN para conciliação e atenção redobrada com o CROSS JOIN acidental: com esses quatro conceitos você já cobre a grande maioria das consultas do dia a dia.

Se quiser aprofundar, vale estudar também subconsultas, funções de agregação e planos de execução. Na Cursa você encontra cursos gratuitos de banco de dados, SQL e desenvolvimento back-end que seguem exatamente esse caminho, do básico à otimização de consultas.

Cookies, Cache e Histórico: O Que o Navegador Guarda Sobre Você

Entenda o que são cookies, cache e histórico do navegador, para que servem, quando limpar cada um e como isso afeta sua privacidade.

Sensores e Atuadores: Como o Arduino Percebe o Mundo e Age Sobre Ele

Entenda a diferença entre sensores e atuadores, como o Arduino lê sinais e aciona dispositivos, e como montar seus primeiros projetos.

Endereço IP, Máscara de Sub-rede e Gateway: O Trio Que Faz Sua Rede Funcionar

Entenda de forma prática o que são endereço IP, máscara de sub-rede e gateway padrão, e como esses três parâmetros conversam entre si.

Compressão de Arquivos: Como o ZIP Consegue Reduzir o Tamanho dos Seus Dados

Entenda como funciona a compressão de arquivos, a diferença entre métodos com e sem perda e quando cada formato faz sentido.

Expressões Regulares (Regex): O Que São e Como Usar na Prática

Aprenda o que são expressões regulares, os principais símbolos, quantificadores e como aplicar regex para buscar e validar textos.

Como Funciona o DNS: o Sistema que Traduz Nomes em Endereços na Internet

Entenda de forma simples o que é DNS, como acontece a resolução de nomes, os principais tipos de registro e por que ele é essencial para a internet.

INNER JOIN, LEFT JOIN e RIGHT JOIN: como relacionar tabelas no SQL

Entenda de forma simples como funcionam INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN para combinar dados de várias tabelas no SQL.

TypeScript para iniciantes: o que é e por que ele melhora o JavaScript

Entenda o que é TypeScript, como a tipagem estática ajuda a evitar erros e por que ele se tornou essencial no desenvolvimento web moderno.