Voltar para a lista de artigos Artigos
8 minutos de leitura

Como escrever várias junções em uma consulta SQL

Você já se perguntou como funcionam as junções múltiplas? Quer saber como unir várias tabelas em uma única consulta? Leia este artigo para descobrir!

Se você está apenas começando sua jornada no SQL, talvez tenha achado difícil entender o conceito de SQL JOINs, especialmente se tiver de unir mais de duas tabelas em uma consulta. Não se preocupe! Neste artigo, exploraremos como o JOIN funciona e resolveremos todos os seus mistérios!

A melhor maneira de aprender SQL é por meio da prática. Se você quiser dominar a junção de tabelas em SQL, confira nosso Cláusulas JOIN em SQL curso interativo. Ele oferece mais de 90 exercícios práticos que farão com que você escreva muitos tipos diferentes de JOINs.

Vamos começar com um exemplo

Imagine que você tenha as três tabelas a seguir: player, team, e coach.

Como escrever várias junções em uma consulta SQL

Vamos criar uma consulta que listará os nomes de todos os jogadores, o nome do time e o nome do técnico. Você pode obter todas essas informações usando a seguinte consulta:

SELECT 
  player.name, 
  team.name, 
  coach.name
FROM player
JOIN team
ON player.team_id = team.id
JOIN coach
ON team.coach_id = coach.id;

Temos duas operações JOIN diferentes aqui. As tabelas player e team são unidas primeiro e, em seguida, a tabela coach também é unida.

Para criar uma condição de união, precisamos que ambas as tabelas unidas tenham uma coluna que contenha as mesmas informações. A coluna team_id na tabela player contém team_id; esse é o mesmo valor que a coluna id na tabela team da tabela. Portanto, a primeira condição de união é ON player.team_id = team.id

Da mesma forma, a união entre a tabela team e a tabela coach é ON team.coach_id = coach.id.

Se você tiver dificuldade para lembrar a sintaxe exata de Cláusulas JOIN em SQL, não deixe de marcar nossa incrível folha de dicas sobre SQL JOIN!

Como funciona a junção de várias tabelas

Digamos que tenhamos os seguintes dados em nossas tabelas:

coach
idname
1Mark Swanson
2Alice Wright
team
idnamecoach_id
1Ambitious Raptors2
2Fire Pandas1
3Steel Cats2
player
idnameteam_id
1John Rodger1
2Paul Smith1
3David McDonald2
4Sarah Grey3
5Sophie Brown3

Agora, vamos executar a consulta que listará os nomes de todos os jogadores, o nome do time e o nome do técnico:

SELECT player.name, team.name, coach.name
FROM player
JOIN team
ON player.team_id = team.id
JOIN coach
ON team.coach_id = coach.id;

Obteremos a seguinte tabela como resultado:

player.nameteam.namecoach.name
John RodgerAmbitious RaptorsAlice Wright
Paul SmithAmbitious RaptorsAlice Wright
David McDonaldFire PandasMark Swanson
Sarah GreySteel CatsAlice Wright
Sophie BrownSteel CatsAlice Wright

Ok, mas o que realmente acontece "por baixo do pano" quando duas tabelas são unidas? Vamos dar uma olhada mais de perto em nosso exemplo.

Primeiro, o site JOIN das tabelas player e team formam uma "tabela virtual". Ela teria a seguinte aparência:

player.idplayer.nameplayer.team_idteam.idteam.nameteam.coach_id
1John Rodger11Ambitious Raptors2
2Paul Smith11Ambitious Raptors2
3David McDonald22Fire Pandas1
4Sarah Grey33Steel Cats2
5Sophie Brown33Steel Cats2

Como você pode ver, essa "tabela virtual" contém todas as colunas das tabelas player e team tabelas.

Ei, juntamos 3 tabelas nessa consulta de exemplo! O que aconteceu com a tabela coach tabela? Isso é fácil! Já temos uma "tabela virtual" composta pelas tabelas player e team portanto, parece que estamos novamente com uma união de duas tabelas - só que desta vez vamos unir a tabela coach à "tabela virtual". Portanto, a tabela unida final terá a seguinte aparência:

player.idplayer.nameplayer.team_idteam.idteam.nameteam.coach_idcoach.idcoach.name
1John Rodger11Ambitious Raptors22Alice Wright
2Paul Smith11Ambitious Raptors22Alice Wright
3David McDonald22Fire Pandas11Mark Swanson
4Sarah Grey33Steel Cats22Alice Wright
5Sophie Brown33Steel Cats22Alice Wright

As colunas que pertencem à "tabela virtual" (a união das tabelas player e team) são mostradas em laranja; as colunas da tabela coach são mostradas em azul.

Importante: quando unimos outra tabela, a condição de união deve incluir uma coluna que corresponda a uma coluna de uma das tabelas unidas anteriormente. Em nosso exemplo, a tabela coach é unida à tabela virtual usando o ID do técnico, que está presente na tabela coach e na tabela team tabela. Portanto, ele estava presente na "tabela virtual". Você pode imaginar que as tabelas unidas são "vinculadas" umas às outras com condições de união:

Como escrever várias junções em uma consulta SQL

É claro que não precisamos exibir todas as colunas da tabela unida. Nas consultas JOIN, geralmente especificamos quais colunas gostaríamos de ver. Observe que fizemos isso na consulta de exemplo acima: somente o nome do jogador, o nome do time e o nome do técnico foram exibidos.

Tabelas de junção

Uma tabela de junção é uma tabela que vincula duas ou mais tabelas. Muitas junções de várias tabelas envolvem o uso de uma tabela de junção. Parece vago? Vamos ver isso em ação.

Imagine que você tenha as tabelas author e book. Um autor pode ter escrito muitos livros e um livro pode ter muitos autores. Para modelar esse relacionamento (que chamamos de relacionamento muitos-para-muitos), precisamos de uma terceira tabela: author_book. O único objetivo dessa tabela é conectar as tabelas author e book juntas. A tabela author_book é um exemplo de uma tabela de junção.

Como escrever várias junções em uma consulta SQL

Digamos que tenhamos os seguintes dados em nossas tabelas:

author
idname
1Sarah Green
2Martin Davis
3Steve Johnson
book
idname
1The Translucent Door
2Whisper of Dawn
3To Catch a Dream
author_book
author_idbook_id
11
21
12
32
23

Se você quiser unir as tabelas author e book você também deve usar a tabela de junção author_book. Por exemplo, para listar todos os autores e seus livros, você pode escrever uma consulta como esta:

SELECT 
  author.name, 
  book.name
FROM author
JOIN author_book
ON author.id = author_book.author_id
JOIN book
ON book.id = author_book.book_id
ORDER BY author.name;

Primeiro, a tabela author_book é unida à tabela author para formar uma "tabela virtual". Em seguida, a tabela book é unida à "tabela virtual".

Ao unir tabelas vinculadas por uma tabela de junção, certifique-se de unir as tabelas que não são de junção à tabela de junção. Em nosso exemplo, author é unida com author_book. Então book também é unida. Se você tiver uma tabela de junção em seu banco de dados, as junções envolvendo essas tabelas geralmente envolverão três ou mais tabelas.

O resultado da consulta terá a seguinte aparência. Não vemos nenhuma das colunas da tabela de junção no resultado, mas a união é essencial para que a consulta funcione corretamente:

author.namebook.name
Sarah GreenThe Translucent Door
Martin DavisThe Translucent Door
Sarah GreenWhisper of Dawn
Steve JohnsonWhisper of Dawn
Martin DavisTo Catch a Dream

Uma tabela de junção com colunas adicionais

No exemplo acima, as únicas colunas presentes na tabela de junção eram as colunas que faziam referência a outras tabelas. No entanto, esse não precisa ser o caso! A tabela de junção também pode conter outros campos. Esses campos armazenam informações adicionais sobre a relação.

Vamos dar uma olhada em um exemplo. Desta vez, temos as três tabelas a seguir: doctor, patient e appointment. Você consegue adivinhar qual tabela é a tabela de junção aqui?

Como escrever várias junções em uma consulta SQL

Você está certo! A tabela de junção é a tabela appointment tabela. Ela conecta os médicos aos seus pacientes para criar consultas. Entretanto, a tabela appointment também precisa de colunas adicionais, como data e hora da consulta.

Digamos que tenhamos os seguintes dados em nossas tabelas:

doctor
idname
1Ann Johnson
2Marlene Smith
3John West
patient
idname
1Mary Brown
2Sally Rodgers
3Mark Jackson
appointment
iddoctor_idpatient_iddatetime
11116/04/20238:00
21316/04/20239:00
32217/04/20238:00
42117/04/20239:00
53317/04/202316:00

Agora, vamos criar uma consulta que ajudará os médicos a gerenciar sua agenda: para cada médico, gostaríamos de ver todas as datas e horários de suas consultas, além do nome do paciente relevante. Você pode obter todas essas informações usando a seguinte consulta:

SELECT 
  doctor.name, 
  appointment.date, 
  appointment.time, 
  patient.name
FROM doctor
JOIN appointment
ON doctor.id = appointment.doctor_id
JOIN patient
ON appointment.patient_id = patient.id;

Primeiro, a tabela appointment é unida à tabela doctor para formar uma "tabela virtual". Em seguida, a tabela patient é unida à "tabela virtual" fazendo referência à tabela de junção appointment.

O resultado da consulta teria a seguinte aparência:

doctor.nameappointment.dateappointment.timepatient.name
Ann Johnson16/04/20238:00Mary Brown
Ann Johnson16/04/20239:00Mark Jackson
Marlene Smith17/04/20238:00Sally Rodgers
Marlene Smith17/04/20239:00Mary Brown
John West17/04/202316:00Mark Jackson

Uma tabela de junção de 3 vias

As tabelas de junção também podem vincular três ou mais tabelas. Por exemplo, imagine que um médico trabalhe em vários locais de clínicas. Ao agendar uma consulta, você é designado a um médico, mas também precisa escolher a clínica onde a consulta será realizada. Portanto, nossa tabela appointment agora vincularia três tabelas: doctor, patient, e clinic.

Nesse cenário, muitas consultas exigirão a união das quatro tabelas. Em algumas situações, as tabelas de junção podem vincular ainda mais tabelas.

Vamos unir algumas tabelas!

Bom trabalho! Você acabou de aprender a usar vários JOINs em uma consulta SQL.

Vamos resumir o que acabamos de aprender:

  • Um JOIN de três tabelas é um JOIN de duas tabelas com outra junção. O JOIN de duas tabelas forma uma "tabela virtual" à qual a outra tabela é unida.
  • A condição de união geralmente é uma igualdade entre algumas colunas de uma tabela que compartilham valores com colunas da outra tabela.
  • Ao unir mais de duas tabelas, na maioria dos casos, você precisará garantir que a condição de união seja "vinculada" às tabelas que já foram unidas.
  • Uma tabela de junção é uma tabela que vincula duas ou mais tabelas fazendo referência aos IDs das tabelas relevantes. Quando uma tabela de junção está envolvida, você provavelmente precisará usar uma união de várias tabelas.

Se estiver curioso para saber mais sobre Cláusulas JOIN em SQL, dê uma olhada nestes artigos em nosso blog:

E para praticar um pouco mais, lembre-se de conferir nosso Cláusulas JOIN em SQL curso interativo!