Voltar para a lista de artigos Artigos
8 minutos de leitura

INNER JOIN vs. OUTER JOIN: Qual é a diferença?

Decidir quando usar INNER JOIN ou OUTER JOIN costuma ser um desafio para os iniciantes. Neste artigo, você encontrará explicações e exemplos que o ajudarão a entender melhor a diferença entre essas duas uniões.

No SQL, JOINs permite combinar dados de tabelas diferentes; INNER JOIN e OUTER JOIN são simplesmente tipos de instruções JOIN. Compreender suas diferenças é fundamental se você trabalha com bancos de dados relacionais. Também é fundamental se você estiver indo para uma entrevista de emprego em SQL: a diferença entre INNER JOIN e OUTER JOIN está entre as perguntas mais frequentes da entrevista sobre SQL.

Para revisar seus conhecimentos sobre JOINs, recomendo nosso curso interativo Cláusulas JOIN em SQL. Você encontrará 93 exercícios práticos que abrangem todos os diferentes casos de uso de INNER JOIN vs. OUTER JOIN. Além disso, você aprenderá a filtrar dados corretamente com diferentes variantes de JOIN e a combinar tabelas com colunas que não são chaves.

O que é um JOIN no SQL?

Vamos começar com a revisão de um SQL básico JOIN.

Imagine que você tenha um banco de dados universitário com as tabelas student e lecturer. Na tabela student temos o campo opcional advisor_id que armazena o ID do professor que é o orientador da tese do aluno. Um aluno pode não ter um orientador se ainda não estiver escrevendo sua tese.

Para exibir os nomes dos alunos e de seus orientadores, usamos a instrução JOIN:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id;

Os dados resultantes podem ter a seguinte aparência:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez

A instrução JOIN vem depois da cláusula FROM: você coloca o nome da primeira tabela depois de FROM, depois a palavra-chave JOIN, depois o nome da outra tabela, seguido pela palavra-chave ON e a condição JOIN. Em nosso caso, a condição JOIN é student.advisor_id = lecturer.id.

Essa consulta retorna linhas em que o advisor_id na tabela student corresponde a id na tabela lecturer tabela. Basicamente, ela retorna os nomes dos alunos juntamente com os nomes de seus orientadores.

Para referência futura sobre todos os tipos de JOINs, recomendamos que você marque ou imprima nossa Folha de consulta SQL JOIN.

O que é um INNER JOIN?

Quando você usa a palavra-chave JOIN no SQL, na verdade está fazendo um INNER JOIN. Um INNER JOIN retorna todas as combinações de linhas das duas tabelas que satisfazem a condição ON. Em nosso exemplo, ele retornou os nomes dos alunos e de seus orientadores.

Entretanto, um INNER JOIN não é suficiente se você quiser incluir linhas que não tenham uma correspondência na outra tabela. Por exemplo, talvez você queira exibir os nomes de todos os alunos, mesmo aqueles que ainda não têm um orientador. Ou talvez seja necessário incluir os nomes de todos os professores, mesmo aqueles que não estão orientando nenhum aluno. É nesse momento que o OUTER JOIN entra em ação.

O que é um OUTER JOIN?

Um OUTER JOIN é o tipo de JOIN que retorna as linhas correspondentes das duas tabelas mais todas as linhas não correspondentes de uma (ou, às vezes, de ambas) das tabelas. OUTER JOIN tem três variantes: LEFT OUTER JOIN, RIGHT OUTER JOIN, e FULL OUTER JOIN. Vamos examinar cada uma delas.

JUNÇÃO EXTERNA ESQUERDA

LEFT OUTER JOIN (ou simplesmente LEFT JOIN) retorna todas as linhas da tabela da esquerda (a tabela à esquerda da instrução JOIN, ou seja, imediatamente após FROM) com dados correspondentes da tabela da direita (a tabela à direita (ou seja, imediatamente após) da instrução JOIN ). Se não houver correspondência, as colunas provenientes da tabela da direita serão preenchidas com NULL.

Usando os operadores student e lecturer como exemplo, podemos usar LEFT JOIN para obter uma lista de todos os alunos com os dados de seus orientadores. Queremos incluir todos os alunos, mesmo aqueles que ainda não têm um orientador. A consulta teria a seguinte aparência:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id;

Os resultados são:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
Diana PrinceNULL

Nos resultados, podemos ver uma linha que não foi incluída anteriormente. A aluna Diana Prince não tem orientador, portanto não foi incluída no resultado da consulta INNER JOIN. Entretanto, com LEFT JOIN, ela foi incluída. LEFT JOIN inclui todas as linhas da tabela da esquerda, mesmo aquelas que não têm uma linha correspondente na tabela da direita. As colunas que vêm da tabela lecturer tabela são mostradas como NULL.

Leia este artigo sobre LEFT OUTER JOINs em SQL se precisar de mais informações.

JUNÇÃO EXTERNA DIREITA

RIGHT OUTER JOIN (ou simplesmente RIGHT JOIN) retorna todas as linhas da tabela da direita (a segunda tabela) com dados correspondentes da tabela da esquerda (a primeira tabela). Se não houver correspondência, as colunas provenientes da tabela da esquerda serão preenchidas com nulos.

Suponha que queiramos listar os professores com os dados dos alunos que eles estão orientando. Queremos incluir todos os professores, mesmo aqueles que não estão orientando nenhum aluno. Portanto, escreveríamos uma consulta como esta:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS lecturer_name
FROM student
RIGHT JOIN lecturer
ON student.advisor_id = lecturer.id;

O resultado dessa consulta é:

student_namelecturer_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
NULLKeiko Tanaka
NULLJamal Al-Fayed
NULLNadia Kowalski

O uso de RIGHT JOIN na consulta nos permite obter uma lista de todos os palestrantes, independentemente de estarem ou não atribuídos a alunos. Se um professor estiver atribuído a um aluno, ele será listado com o nome do aluno. Se um professor não estiver atribuído a nenhum aluno, os dados do aluno no conjunto de resultados serão NULL.

Consulte este guia completo sobre junções SQL para obter todos os recursos necessários para entender completamente esse assunto.

JUNÇÃO EXTERNA COMPLETA

FULL OUTER JOIN (ou simplesmente FULL JOIN) nos permite obter todos os dados de ambas as tabelas, independentemente de haver ou não uma correspondência entre suas linhas. Em nosso exemplo, o uso de FULL JOIN entre student e lecturer retorna todos os alunos e todos os professores. A consulta teria a seguinte aparência:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
FULL JOIN lecturer
ON student.advisor_id = lecturer.id;

E os resultados seriam os seguintes:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
Diana PrinceNULL
NULLKeiko Tanaka
NULLJamal Al-Fayed
NULLNadia Kowalski

No resultado, você pode ver todos os alunos e todos os professores. Se um aluno não tiver um orientador, os dados do orientador serão NULL. Se um professor não estiver atribuído a nenhum aluno, os dados do aluno correspondente serão NULL.

Encontre mais exemplos e teste seus conhecimentos com estas 12 questões práticas sobre SQL JOIN.

Há alguns sistemas de gerenciamento de bancos de dados relacionais (RDBMSs), como MySQL e MariaDB, que não suportam FULL JOIN. Você pode obter o mesmo resultado nesses DBMSs, mas a consulta é um pouco mais longa.

A maneira de criar um FULL JOIN nas versões do SQL que não suportam esse comando é usar UNION entre o INNER JOIN, o LEFT JOIN e o RIGHT JOIN:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id

UNION
SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
RIGHT JOIN lecturer
ON student.advisor_id = lecturer.id;

No script acima, a união das três formas de JOIN - LEFT JOIN, INNER JOIN e RIGHT JOIN - resulta nos mesmos dados que o FULL JOIN nos RDBMS que o suportam.

Quando você sentir que pegou o jeito do Cláusulas JOIN em SQL, leia estas perguntas e respostas da entrevista sobre SQL JOIN para verificar se você está pronto para a entrevista de emprego.

Resumo de INNER JOIN vs. OUTER JOIN

Podemos sintetizar o que aprendemos sobre INNER JOIN e OUTER JOIN na tabela a seguir:

 

INNER JOIN

OUTER JOIN

Explicação

RRetorna linhas das duas tabelas onde a condição ON é satisfeita

Retorna linhas das duas tabelas onde a condição ON é satisfeita E também os registros não correspondentes de uma ou ambas as tabelas, preenchendo com nulos onde não há correspondências.

Tipos

1 tipo: JOIN

3 tipos diferentes: LEFT JOIN, RIGHT JOIN, FULL JOIN

Abreviação

JOIN = INNER JOIN

LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN
FULL JOIN = FULL OUTER JOIN

Exemplo

SELECT
  student.full_name,
  lecturer.full_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id;

SELECT

  student.full_name,
  lecturer.full_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id;

Confira esta lista de sete exemplos de SQL JOIN com explicações para obter mais detalhes.

Onde aprender mais sobre INNER JOIN e OUTER JOIN

Agora que você conhece as diferenças entre INNER JOIN e OUTER JOIN, pode escrever consultas precisas que geram informações confiáveis e precisas. Com a prática, você será capaz de responder a qualquer pergunta de entrevista sobre SQL sobre as diferenças entre INNER JOIN e OUTER JOIN.

Antes de ir, recomendo nosso Cláusulas JOIN em SQL curso se quiser aprofundar seus conhecimentos. Ao final do curso, você conhecerá as diferentes maneiras de obter dados combinados de várias tabelas. E entenderá como escolher a melhor opção para cada cenário.

Agora é sua vez de começar a obter informações sobre as diferenças entre INNER JOIN e OUTER JOIN. Bom aprendizado!