Voltar para a lista de artigos Artigos
10 minutos de leitura

Como Juntar 3 Tabelas (ou Mais) Em SQL

Usar JOIN em SQL não significa que você só pode unir duas tabelas. Você pode unir três, quatro, ou até mais! As possibilidades são infinitas.

Se você acabou de aprender a usar JOINs em SQL, pode achar que está limitado a duas tabelas. Isso é bem comum - este conceito pode ser difícil de entender, e a ideia de que podemos usar essa função em casos mais complexos pode assustar no início. Você pode estender o uso da função para três tabelas ou até mais. Veja a consulta abaixo:

SELECT
  estudante.primeiro_nome,
  estudante.sobrenome,
  curso.nome
FROM estudante
JOIN curso_para_estudantes
  ON estudante.id = curso_para_estudantes.identificacao_de_estudante
JOIN curso
  ON curso.id = curso_para_estudantes.identificacao_do_curso;

Basta repetir a cláusula JOIN para juntar três tabelas. Na próxima seção, nos aprofundaremos na consulta e nas tabelas.

Antes de continuarmos, recomendo fortemente que você conheça bem as funções JOIN em SQL. O conceito que irei explicar baseia-se em conhecimentos básicos. Se você ainda não está nesse nível, confira o curso Cláusulas JOIN em SQL em LearnSQL.com.br.

Conhecendo os dados

Primeiro, vamos apresentar algumas tabelas. Aqui está o esquema:

No modelo entidade-relacionamento (ER) acima, você pode ver as tabelas, suas colunas, os tipos de dados das colunas e as referências entre as tabelas. Por exemplo, há uma referência entre as tabelas estudante e curso_para_estudantes - cada estudante pode ser ligado a várias linhas na tabela curso_para_estudantes. Para saber mais sobre como ler um esquema, veja o artigo Notação Pé de Galinha (Crow's Foot) no blog da Vertabelo.

Nossos dados de exemplo estão armazenados em quatro tabelas. Por enquanto, vamos focar nas três primeiras:

  • estudante - Contém informações sobre os estudantes:
    • id - A identificação do aluno.
    • primeiro_nome - O primeiro nome do aluno.
    • sobrenome - O sobrenome do aluno.
  • curso_para_estudantes - Contém informações sobre quais alunos frequentam quais cursos:
    • identificacao_de_estudante - O ID do aluno.
    • identificacao_do_curso - O ID do curso.
  • curso - Contém informações sobre os cursos:
    • id - A identificação do curso.
    • nome - O nome do curso.
    • identificacao_do_professor - O documento de identidade do professor do curso.

Falarei sobre a tabela professor mais tarde, quando a usarmos em consultas mais avançadas. Enquanto isso, dê uma olhada nos dados de exemplo destas três tabelas:

estudante

idprimeiro_nomesobrenome
1SheilaBarros
2LuanaFlores
3JoséNeves

curso_para_estudantes

identificacao_de_estudanteidentificacao_do_curso
12
13
21
22
23
31

curso

idnomeidentificacao_do_professor
1Construção de Bancos de Dados1
2Literatura Inglesa2
3Programação em Python1

Tabelas de Junção

É importante notar que a tabela curso_para_estudantes é uma tabela de junção. O único objetivo desta tabela é conectas as tabelas estudante e curso.

Por exemplo, "Sheila Barros" (aluna com id = 1) está conectada a "Literatura Inglesa" (curso com id = 2) e "Programação em Python" (curso com id = 3). Como sabemos disso? Dê uma olhada nas duas primeiras linhas da tabela curso_para_estudantes. A primeira linha diz que o aluno com ID igual a 1 ( coluna identificacao_de_estudante ) está ligado a um curso com ID igual a 2 ( coluna identificacao_do_curso ). Na segunda linha, vemos que o aluno com ID igual a 1 está ligado a um curso com ID igual a 3. Na tabela estudante, vemos que Sheila Barros tem ID igual a 1. Por fim, olhando para a tabela de curso podemos ver que os cursos Literatura Inglesa e a Programação em Python têm IDs iguais a 2 e 3, respectivamente.

A relação entre as tabelas estudante e curso são chamadas de relacionamento de muitos para muitos. Um estudante pode estar frequentando muitos cursos (ou seja, podem existir muitas linhas com a mesma identificacao_de_estudante na tabela curso_para_estudantes) e um curso pode ser frequentado por muitos alunos (ou seja, muitas linhas na tabela curso_para_estudantes podem ter a mesma identificacao_do_curso).

Já vimos o uso da tabela de junção. Dê uma olhada no código novamente:

SELECT
  estudante.primeiro_nome,
  estudante.sobrenome,
  curso.nome
FROM estudante
JOIN curso_para_estudantes
  ON estudante.id = curso_para_estudantes.identificacao_de_estudante
JOIN curso
  ON curso.id = curso_para_estudantes.identificacao_do_curso;

Como você pode ver, estamos usando a tabela estudante na cláusula FROM. Em seguida, estamos unindo-a com a tabela curso_para_estudantes e, finalmente, com a tabela curso. Desta forma, podemos exibir o primeiro nome e o sobrenome de cada aluno junto com os cursos que eles estão frequentando. Ainda está achando o código confuso? Não se preocupe - explicaremos em mais detalhes na próxima seção.

O resultado desta consulta será o seguinte:

primeiro_nomesobrenomenome
SheilaBarrosLiteratura Inglesa
SheilaBarrosProgramação em Python
LuanaFloresConstrução de Bancos de Dados
LuanaFloresLiteratura Inglesa
LuanaFloresProgramação em Python
JoséNevesConstrução de Bancos de Dados

Se você deseja escrever suas próprias consultas para juntar várias tabelas, precisará entender tudo o que está acontecendo nesta consulta. Vamos dividi-la em etapas.

Juntando três tabelas usando uma tabela de junção

Passo 1

O primeiro passo é olhar para o esquema e selecionar as colunas que queremos exibir. Como queremos mostrar os alunos junto com seus cursos, precisaremos de três colunas: estudante.primeiro_nome, estudante.sobrenome e curso.nome.

É importante usar os nomes das tabelas ao listar suas colunas. Dessa forma, você não se perderá em nomes de colunas diferentes e saberá exatamente qual coluna pertence a qual tabela.

Aqui, nossa consulta deve se parecer com esta:

SELECT
  estudante.primeiro_nome,
  estudante.sobrenome,
  curso.nome

Passo 2

O próximo passo é determinar quais tabelas serão necessárias para a consulta. Há duas tabelas óbvias: estudante e curso. No entanto, teremos que encontrar uma maneira de juntar essas duas tabelas. Olhando para o esquema do banco de dados, vemos que curso_para_estudantes é uma tabela de junção entre estas duas. Portanto, também precisaremos dela.

Etapa 3

Por fim, teremos que unir todas as tabelas. A primeira tarefa é escolher a tabela que irá na cláusula FROM. Em teoria, poderia ser qualquer uma das tabelas que estamos usando. Pessoalmente, eu gosto de começar com uma tabela que não seja uma tabela de junção. Neste caso, vamos com a tabela de estudante.

SELECT
  estudante.primeiro_nome,
  estudante.sobrenome,
  curso.nome
FROM estudante

Por enquanto, não podemos juntar a tabela curso, pois não há uma conexão direta entre estas duas tabelas. Por isso, teremos que usar a tabela curso_para_estudantes. Basta juntar essas duas tabelas usando a declaração JOIN … ON …. Nosso código toma forma:

SELECT
  estudante.primeiro_nome,
  estudante.sobrenome,
  curso.nome
FROM estudante
JOIN curso_para_estudantes
  ON estudante.id = curso_para_estudantes.identificacao_de_estudante

Antes de juntarmos a última tabela, devemos analisar o que foi feito até aqui. Note que, ao usarmos uma cláusula JOIN, não estamos limitados às colunas da cláusula SELECT - temos acesso a todas as colunas! Então, nossa consulta fica assim:

SELECT
  estudante.primeiro_nome,
  estudante.sobrenome,
  estudante.id,
  curso_para_estudantes.identificacao_de_estudante,
  curso_para_estudantes.identificacao_do_curso
FROM estudante
JOIN curso_para_estudantes
  ON estudante.id = curso_para_estudantes.identificacao_de_estudante;

Esta consulta mostra quase todas as colunas que podemos usar com a próxima declaração JOIN (removi a coluna curso_para_estudantes.id, pois não precisaremos dela). Dê uma olhada nos dados com os quais estamos trabalhando:

primeiro_nomesobrenomeididentificacao_de_estudanteidentificacao_do_curso
SheilaBarros112
SheilaBarros113
LuanaFlores221
LuanaFlores222
LuanaFlores223
JoséNeves331

É assim que nossos dados estão no meio do processo. Muitas vezes, é bom pensar sobre os dados neste ponto. Às vezes você pode querer escrever uma consulta assim só para analisar suas linhas e colunas.

O resultado acima deve ser suficiente para indicar o que fazer a seguir. Temos alunos conectados pelas identificações dos cursos que estão fazendo. A única coisa que precisamos acrescentar é a informação do curso. Sabemos que a coluna identificacao_do_curso está na tabela curso_para_estudantes. Temos que juntá-la com a coluna id da tabela curso. A consulta resultante fica assim:

SELECT
  estudante.primeiro_nome,
  estudante.sobrenome,
  curso.nome
FROM estudante
JOIN curso_para_estudantes
  ON estudante.id = curso_para_estudantes.identificacao_de_estudante
JOIN curso
  ON curso.id = curso_para_estudantes.identificacao_do_curso;

Pronto! Essa é a consulta que queríamos escrever. Só não se esqueça do ponto-e-vírgula no final de seu código.

Neste exemplo, vimos como escrever uma consulta com EQUI JOINs - usamos a igualdade em nossas condições de junção. Este é o tipo mais comum de JOIN. Entretanto, você também pode usar JOINs não-equi. Se você não conhece este termo, recomendo conferir o Guia Ilustrado sobre JOINs Não-equi em SQL no blogLearnSQL.com.br .

Juntando tabelas em SQL sem uma tabela de junção

Ao unir mais de duas tabelas, nem sempre haverá uma tabela de junção. Antes de analisarmos um exemplo de consulta para esta técnica, vamos observar a última tabela em nosso esquema.

  • professor - Contém informações sobre os professores:
    • id - A identificação do professor.
    • primeiro_nome - O primeiro nome do professor.
    • sobrenome - O sobrenome do professor.

E aqui está a tabela professor:

idprimeiro_nomesobrenome
1ThaisBrito
2SaraBandeira

Agora, considerando os dados, gostaríamos de exibir cada professor com seus alunos. Cada par professor-aluno deve ser exibido apenas uma vez (por exemplo, se um professor tem mais de um curso com um aluno, o professor deve ser mostrado apenas uma vez com o aluno no resultado).

Esta consulta parece muito com a anterior. Portanto, vamos seguir os mesmos passos.

Passo 1

Primeiro, selecionamos as colunas: professor.primeiro_nome, professor.sobrenome, estudante.primeiro_nome e estudante.sobrenome. Em seguida, escolhemos as tabelas necessárias. Desta vez, serão todas as tabelas do nosso esquema: estudante, curso_para_estudantes, cursoe professor.

Passo 2

Agora, temos juntar todas as tabelas. Como disse antes, podemos começar com qualquer uma delas, mas prefiro começar por um dos lados. Da última vez, colocamos a tabela estudante na cláusula FROM. Desta vez, usaremos a tabela professor. Antes de escrever qualquer JOIN, nossa consulta ficará como a exibida abaixo (note a palavra-chave DISTINCT; como queremos mostrar pares distintos de professor-aluno, esta palavra-chave é muito importante).

SELECT DISTINCT
  professor.primeiro_nome,
  professor.sobrenome.
  estudante.primeiro_nome,
  estudante.sobrenome
FROM professor

Passo 3

Agora, podemos juntar as tabelas da mesma forma como fizemos no exemplo anterior. Basta usarmos a cláusula JOIN mais uma vez. No entanto, antes de fazê-lo, vamos dar uma olhada nos dados após unirmos as tabelas professor e curso:

SELECT
  professor.primeiro_nome,
  professor.sobrenome,
  professor.id,
  curso.identificacao_do_professor,
  curso.nome,
  curso.id
FROM professor
JOIN curso
  ON professor.id = curso.identificacao_do_professor;
primeiro_nomesobrenomeididentificacao_do_professornomeid
ThaisBrito11Construção de Bancos de Dados1
ThaisBrito11Programação em Python3
SaraBandeira22Literatura Inglesa2

Você pode considerar como uma só tabela. Na verdade, é como se fosse uma versão ampliada da tabela curso.

Juntar duas tabelas adicionais é quase o mesmo processo que fizemos anteriormente. Basta adicionar as mesmas duas cláusulas JOINs como fizemos antes. Tenha em mente que as cláusulas JOINs devem ser escritas na ordem correta. Na junção, você não pode usar colunas de tabelas que ainda não foram chamadas na consulta.

SELECT DISTINCT
  professor.primeiro_nome,
  professor.sobrenome.
  estudante.primeiro_nome,
  estudante.sobrenome
FROM professor
JOIN curso
  ON professor.id = curso.identificacao_do_professor
JOIN curso_para_estudantes
  ON estudante.id = curso_para_estudantes.identificacao_de_estudante
JOIN estudante
  ON curso_para_estudantes.identificacao_do_curso = curso.id;
JOIN curso_para_estudantes
  ON curso.id = curso_para_estudantes.identificacao_de_estudante
JOIN estudante
  ON curso_para_estudantes.identificacao_do_curso = estudante.id;

Na parte riscada, copiei uma parte do código da primeira consulta onde juntamos três tabelas. Neste caso, o código estava errado; mesmo que as condições estivessem corretas, estávamos usando tabelas que ainda não haviam sido chamadas. Por exemplo, ao juntar a tabela curso_para_estudantes, utilizamos a tabela estudante, que foi introduzida depois.

Abaixo do código riscado, você pode ver a ordem correta das cláusulas JOIN. Primeiro, devemos juntar a tabela curso_para_estudantes à tabela de cursos. Em seguida, usando a tabela curso_para_estudantes, podemos juntar a tabela estudante. Desta forma, introduzimos cada tabela antes de utilizá-la em uma condição JOIN … ON . Esta é uma regra importante. Lembre-se dela!

O resultado da consulta acima será o seguinte:

primeiro_nomesobrenomeprimeiro_nomesobrenome
ThaisBritoSheilaBarros
ThaisBritoLuanaFlores
ThaisBritoJoséNeves
SaraBandeiraSheilaBarros
SaraBandeiraLuanaFlores

Neste caso, usamos um INNER JOIN. Isto significa que se o professor não tiver alunos, ele não aparecerá nos resultados. É claro, você pode substituir o INNER JOIN por qualquer outro tipo de JOIN, por exemplo, LEFT OUTER JOIN. Se você deseja saber mais sobre LEFT JOINs, confira o artigo Como juntar várias tabelas em SQL usando LEFT JOIN em LearnSQL.com.br.

Noções básicas são essenciais para unir 3 tabelas

Como você pode ver, unir três tabelas em SQL não é tão difícil quanto parece. Você pode juntar quantas tabelas quiser - a ideia é a mesma de quando juntamos apenas duas tabelas.

É muito útil dar uma olhada nos dados no meio do processo e imaginar que as tabelas que você já juntou são uma só.

Para ter sucesso no uso das complexas cláusulas JOIN, é importante entender completamente o básico sobre JOINs. Isto lhe permitirá escrever declarações extremamente complexas usando JOINs. Lembre-se - a prática leva à perfeição. Se você precisar de mais explicações ou exercícios sobre JOINs em SQL, dê uma olhada no curso Cláusulas JOIN em SQL em LearnSQL.com.br.