Voltar para a lista de artigos Artigos
11 minutos de leitura

7 Exemplos de SQL JOIN com explicações detalhadas

Você precisa unir várias tabelas para obter o conjunto de resultados necessários? O SQL JOIN é uma ferramenta básica mas importante utilizada pelos analistas de dados que trabalham com bancos de dados relacionais. E entendo que pode ser difícil escolher entre os zilhões de guias introdutórios para junções. Neste artigo, vou me concentrar em exemplos do mundo real com explicações detalhadas.

Introdução à adesão

Com bancos de dados relacionais, as informações desejadas são muitas vezes armazenadas em várias tabelas. Nesses cenários, você precisará juntar-se a essas tabelas. É aqui que entra em jogo o SQL JOIN.

A cláusula JOIN em SQL é usada para combinar linhas de várias tabelas com base em uma coluna relacionada entre estas tabelas. Você pode obter uma visão geral da ferramenta SQL JOIN neste artigo introdutório.

Neste guia, quero cobrir os tipos básicos de Cláusulas JOIN em SQL, passando por vários exemplos. Discutirei em detalhes a sintaxe de cada consulta, como ela funciona, como construir uma condição e como interpretar os resultados.

Para os exemplos, utilizaremos informações sobre uma editora que publica livros originais e traduzidos. Nosso banco de dados contém quatro tabelas: books, authors, editorse translators.

books
idtitletypeauthor_ideditor_idtranslator_id
1Time to Grow Up!original1121
2Your Triptranslated152232
3Lovely Loveoriginal1424
4Dream Your Lifeoriginal1124
5Orangestranslated122531
6Your Happy Lifetranslated152233
7Applied AItranslated132334
8My Last Bookoriginal1128

authors
idfirst_namelast_name
11EllenWriter
12OlgaSavelieva
13JackSmart
14DonaldBrain
15YaoDou

editors
idfirst_namelast_name
21DanielBrown
22MarkJohnson
23MariaEvans
24CathrineRoberts
25SebastianWright
26BarbaraJones
27MatthewSmith

translators
idfirst_namelast_name
31IraDavies
32LingWeng
33KristianGreen
34RomanEdwards

Se você quiser praticar a união de tabelas em SQL com muitos exemplos, eu recomendo tomar o Cláusulas JOIN em SQL curso. Inclui 93 desafios de codificação!

INNER JOIN

Começaremos com um básico INNER JOIN, ou simplesmente, JOIN. Este tipo de união é usado quando desejamos exibir registros correspondentes de duas tabelas.

Exemplo #1

Digamos que queremos mostrar os títulos dos livros junto com seus autores (ou seja, o nome e sobrenome do autor). Os títulos dos livros são armazenados no books tabela, e os nomes dos autores são armazenados na tabela authors mesa.

Em nossa consulta SQL, vamos juntar estas duas tabelas combinando a coluna author_id da tabela books e a coluna id da tabela authors:

SELECT b.id, b.title, a.first_name, a.last_name
FROM books b
INNER JOIN authors a
ON b.author_id = a.id
ORDER BY b.id;

Na declaração SELECT, listamos as colunas a serem exibidas: id do livro, título do livro, nome do autor e sobrenome do autor. Na cláusula FROM, especificamos a primeira tabela a ser incluída (também referida como a tabela da esquerda). Na cláusula INNER JOIN, especificamos a segunda tabela a ser incluída (também referida como a tabela da direita).

Então, usamos a palavra-chave ON para dizer ao banco de dados quais colunas devem ser usadas para corresponder os registros (ou seja, a coluna author_id da books e a coluna id da tabela authors tabela).

Observe também que estamos usando pseudônimos para nomes de tabelas (ou seja b para books e a para authors). Atribuímos os pseudônimos nas cláusulas FROM e INNER JOIN e os utilizamos durante toda a consulta. Os aliases da tabela reduzem a digitação e tornam a consulta mais legível.

Aqui está o conjunto resultante:

idtitlefirst_namelast_name
1Time to Grow Up!EllenWriter
2Your TripYaoDou
3Lovely LoveDonaldBrain
4Dream Your LifeEllenWriter
5OrangesOlgaSavelieva
6Your Happy LifeYaoDou
7Applied AIJackSmart
8My Last BookEllenWriter

Para cada registro na tabela da esquerda (ou seja books), a consulta verifica o author_id, depois procura o mesmo id na primeira coluna da tabela authors mesa. Em seguida, ele puxa o nome e sobrenome correspondentes.

Note que a ordem das tabelas não importa com INNER JOIN, ou simples JOIN. O conjunto de resultados seria exatamente o mesmo se colocássemos o authors na cláusula FROM e na tabela de books tabela na cláusula INNER JOIN.

INNER JOIN exibe apenas os registros que estão disponíveis em ambas as tabelas. Em nosso exemplo, todos os livros têm um autor correspondente e todos os autores têm pelo menos um livro correspondente. Portanto, vamos ver o que acontece se alguns dos registros não forem correspondidos.

Exemplo nº 2

Em nosso segundo exemplo, estaremos exibindo livros junto com seus tradutores (ou seja, o sobrenome do tradutor). Apenas metade de nossos livros foi traduzida e, portanto, temos um tradutor correspondente. Então, qual seria o resultado de se juntar ao books e translators tabelas usando INNER JOIN?

SELECT b.id, b.title, b.type, t.last_name AS translator
FROM books b
JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitletypetranslator
2Your TriptranslatedWeng
5OrangestranslatedDavies
6Your Happy LifetranslatedGreen
7Applied AItranslatedEdwards

A consulta produz somente os livros que foram traduzidos. Acrescentei a coluna do tipo para deixar claro. O resto dos livros não pôde ser correspondido com a coluna de translators tabela e, portanto, não são exibidos. É assim que funciona INNER JOIN.

Observe também que no segundo exemplo, estávamos usando JOIN em vez da palavra-chave INNER JOIN. Ela não tem impacto no resultado porque INNER JOIN é o tipo padrão de join em SQL. Você pode aprender sobre outros tipos de SQL JOIN neste guia detalhado.

Está bem. Agora sabemos como juntar tabelas quando precisamos apenas que os registros correspondentes sejam exibidos. Mas, e se quisermos manter todos os livros no conjunto resultante sem cortar a tabela apenas para os livros traduzidos? Chegou a hora de aprender sobre as uniões externas!

JUNÇÃO À ESQUERDA

Começaremos nossa visão geral do OUTER joins com o LEFT JOIN. Você deve aplicar este tipo de SQL JOIN quando quiser manter todos os registros da tabela da esquerda e somente os registros combinados da tabela da direita.

Exemplo #3

Por exemplo, digamos que queremos exibir informações sobre o autor e o tradutor de cada livro (ou seja, seus sobrenomes). Também queremos manter as informações básicas sobre cada livro (ou seja, id, title, e type).

Para obter todos estes dados, precisaremos juntar três tabelas: books para informações básicas sobre os livros, authors para os sobrenomes dos autores, e translators para os sobrenomes dos tradutores.

Como vimos no exemplo anterior, usando o INNER JOIN (ou simples JOIN) para se juntar ao translators tabela resulta na perda de todos os registros de livros originais (não traduzidos). Isso não é o que queremos agora. Portanto, para manter todos os livros no conjunto de resultados, vamos nos juntar ao books, authorse translators utilizando as tabelas LEFT JOIN.

SELECT b.id, b.title, b.type, a.last_name AS author, 
 t.last_name AS translator
FROM books b
LEFT JOIN authors a
ON b.author_id = a.id
LEFT JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;

Veja que começamos com a books na cláusula FROM, tornando-a a tabela da esquerda. Isso porque queremos manter todos os registros desta tabela. A ordem das outras tabelas não importa.

Em nossa consulta, primeiramente LEFT JOIN a authors tabela baseada na coluna author_id da books e a coluna id da tabela authors mesa. Em seguida, nós nos juntamos à translators tabela baseada na coluna translator_id da books e a coluna id da tabela translators mesa.

Aqui está a tabela resultante:

idtitletypeauthortranslator
1Time to Grow Up!originalWriterNULL
2Your TriptranslatedDouWeng
3Lovely LoveoriginalBrainNULL
4Dream Your LifeoriginalWriterNULL
5OrangestranslatedSavelievaDavies
6Your Happy LifetranslatedDouGreen
7Applied AItranslatedSmartEdwards
8My Last BookoriginalWriterNULL

Ótimo! Guardamos todos os livros!

Observe os valores NULL na coluna translator. Estes valores NULL correspondem aos registros que não foram correspondidos na tabela translators mesa. Estes registros são para livros originais sem nenhum tradutor envolvido.

Esperamos que você tenha compreendido a intuição por trás de LEFT JOINs. Você pode aprender mais sobre este tipo de SQL JOIN neste guia introdutório.

Muito bem, vamos passar por outro exemplo LEFT JOIN para consolidar o conhecimento sobre o tema.

Exemplo #4

Desta vez, queremos mostrar as informações básicas do livro (isto é, ID e título) junto com os sobrenomes dos editores correspondentes. Mais uma vez, queremos manter todos os livros no conjunto de resultados. Então, qual seria a consulta?

SELECT b.id, b.title, e.last_name AS editor
FROM books b
LEFT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL

Bastante simples, certo? Mantivemos novamente todos os livros no conjunto de resultados, inclusive o último, que não tem um editor correspondente em nosso banco de dados (observe o valor NULL na última linha).

Podemos imaginar que o editor não esteja presente na tabela de nossos editores atuais simplesmente porque eles deixaram a editora após a edição do livro.

Espere! E se tivermos alguns editores na equipe que ainda não tenham publicado nenhum livro? Vamos verificar com o próximo tipo de união externa.

JUNÇÃO À DIREITA

RIGHT JOIN é muito semelhante a LEFT JOIN. Aposto que você adivinhou que a única diferença é que RIGHT JOIN mantém todos os registros da tabela da direita, mesmo que não possam ser correspondidos com a tabela da esquerda. Se o fez, você está correto!

Exemplo #5

Vamos repetir nosso exemplo anterior, mas desta vez, nossa tarefa será a de manter todos os registros do editors mesa. Assim, teremos a mesma consulta que no exemplo #4, exceto que substituímos LEFT JOIN por RIGHT JOIN:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
RIGHT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
NULLNULLJones
NULLNULLSmith

Com apenas uma palavra alterada na consulta, o resultado é muito diferente. Podemos ver que de fato temos dois editores(Jones e Smith) que não têm livros correspondentes em nosso banco de dados. Parece que são novas contratações!

E essa não é a única mudança. Também não temos Meu Último Livro no conjunto de resultados. Este registro da tabela da esquerda (i.e, books) não foi igualado na tabela da direita (ou seja, editors) e não chegou ao resultado final.

Os RIGHT JOINs são raramente utilizados na prática, pois geralmente podem ser substituídos por LEFT JOINs que são muito mais comuns.

Por exemplo, em nosso caso, poderíamos pegar nossa consulta do exemplo nº 4 e simplesmente trocar books e editors colocando editors na cláusula FROM, tornando-a a mesa da esquerda, e colocando books na cláusula LEFT JOIN, tornando-a a mesa certa. O resultado teria sido o mesmo que a tabela acima.

JOGOS COMPLETOS

Aqui chegamos ao último tipo de união externa, que é FULL JOIN. Usamos FULL JOIN quando queremos manter todos os registros de todas as tabelas, mesmo as inigualáveis. Portanto, é como LEFT JOIN e RIGHT JOIN juntos. Vamos direto aos exemplos para ver como isto funciona na prática.

Exemplo nº 6

Para começar, vamos juntar-nos novamente à books e editors tabelas, mas desta vez, vamos manter todos os registros de ambas as tabelas. Simplesmente usamos FULL JOIN como a palavra-chave join, deixando o resto da consulta sem nenhuma alteração:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
FULL JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL
NULLNULLJones
NULLNULLSmith

Parece ótimo! Como era de se esperar, guardamos todos os livros, mesmo aquele sem um editor correspondente. Além disso, mantivemos todos os editores, mesmo aqueles que ainda não têm livros correspondentes.

Note que a ordem das tabelas não importa com FULL JOIN. O resultado seria o mesmo se trocássemos as tabelas colocando o editors na cláusula FROM e na tabela de books tabela na cláusula FULL JOIN.

Exemplo #7

Em nosso exemplo final, queremos juntar todas as quatro mesas para obter informações sobre todos os livros, autores, editores e tradutores em uma única mesa. Assim, vamos utilizar FULL JOIN ao longo de nossa consulta SQL:

SELECT b.id, b.title, a.last_name AS author, e.last_name AS editor,
    t.last_name AS translator
FROM books b
FULL JOIN authors a
ON b.author_id = a.id
FULL JOIN editors e
ON b.editor_id = e.id
FULL JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitleauthoreditortranslator
1Time to Grow Up!WriterBrownNULL
2Your TripDouJohnsonWeng
3Lovely LoveBrainRobertsNULL
4Dream Your LifeWriterRobertsNULL
5OrangesSavelievaWrightDavies
6Your Happy LifeDouJohnsonGreen
7Applied AISmartEvansEdwards
8My Last BookWriterNULLNULL
NULLNULLNULLJonesNULL
NULLNULLNULLSmithNULL

Conforme solicitado, a tabela exibe todos os livros, autores, editores e tradutores. Os registros que não foram correspondidos têm os valores NULL. Esta é uma ótima visão geral dos dados armazenados em nosso banco de dados.

Hora de Praticar Cláusulas JOIN em SQL!

Proficiência com Cláusulas JOIN em SQL é um dos principais requisitos para qualquer pessoa que trabalhe com bancos de dados relacionais. Para ajudá-lo a navegar nos diferentes tipos de SQL JOINs, LearnSQL.com desenvolveu uma folha de consultas SQL JOIN de duas páginas. Ela fornece a sintaxe dos diferentes JOINs, bem como exemplos.

No entanto, para dominar o JOINs, é preciso ter muita prática. Eu recomendo começar com o Cláusulas JOIN em SQL curso que cobre os tipos importantes de JOINs, passando por dezenas de exemplos e exercícios. Saiba mais sobre este curso neste artigo geral.

BÔNUS: Aqui estão as 10 principais perguntas da entrevista SQL JOIN e como responder a elas.

Feliz aprendizagem!