Voltar para a lista de artigos Artigos
5 minutos de leitura

Como unir duas tabelas por várias colunas em SQL

O SQL JOIN é uma ferramenta importante para combinar informações de várias tabelas. Na maioria das vezes, você estará unindo tabelas com base em uma chave primária de uma tabela e uma chave estrangeira de outra tabela. No entanto, também é frequente que você precise unir tabelas por duas ou mais colunas. Neste artigo, discutirei por que você quer unir tabelas por várias colunas e como fazer isso em SQL.

Unir tabelas por apenas uma coluna não funciona em alguns cenários. Por exemplo, você pode encontrar casos em que não há uma coluna na tabela que identifique de forma única as linhas. Ou as tabelas que você deseja unir podem não ter apenas uma coluna em comum para usar para unir. Em situações como estas, você pode precisar usar várias colunas para entrar nas tabelas - por exemplo, o primeiro e o último nome, ou o número do pedido e o ano se a numeração do pedido for reiniciada a cada ano.

Vamos ver alguns exemplos para entender como isto funciona na prática.

Unindo duas tabelas em várias colunas

Imaginemos que administramos uma rede de jardins de infância. Em nosso banco de dados, temos as seguintes tabelas:

  • students, onde temos informações sobre cada aluno, como o nome, o jardim de infância que ele ou ela freqüentou, a classe, o ano de formatura e o professor.
  • teachers, onde temos o nome e o nível de instrução de cada professor.
  • classesA escola, onde temos informações sobre cada classe, tais como o nome do jardim de infância, a classe, o ano de formatura e o nome da sala de aula.
students
idfirst_namelast_namekindergartengraduation_yearclassteacher_first_nameteacher_last_name
1MaryJonesSunshine2021AIsabellaLopez
2JohnSmithLove & Learn2020BMiaGonzalez
3MarkAndersonButterfly2020BSophiaStevenson
4StevenMooreButterfly2021CMariaStuart
5DianaMillerButterfly2021CMariaStuart
6AnnaDavisSunshine2021AEmmaGrey
7HellenBrownSunshine2020BOliviaTaylor
8GracyLeeLove & Learn2020ACharlotteJohnson
9SaraGarciaLove & Learn2021BJasmineHarris
10KateWilsonSunshine2019BOliviaTaylor
teachers
idfirst_namelast_nameeducation
101IsabellaLopezUndergraduate
102MariaStuartUndergraduate
103EmmaGreyGraduate
104OliviaTaylorGraduate
105CharlotteJohnsonGraduate
106MiaGonzalezUndergraduate
107SophiaStevensonUndergraduate
108JasmineHarrisUndergraduate
classes
idkindergartengraduation_yearclassclassroom
201Sunshine2019BIronman
202Butterfly2020BSun
203Love & Learn2020ALove
204Love & Learn2020BHappiness
205Sunshine2020AHulk
206Sunshine2020BSuperman
207Butterfly2021AGarden
208Butterfly2021BIsland
209Butterfly2021CSea
210Love & Learn2021ADream
211Love & Learn2021BLaugh
212Sunshine2021AIronman

Você pode notar que nosso banco de dados não está perfeitamente organizado. Tipicamente, o students A tabela incluiria chaves estrangeiras como o ID do professor e o ID da classe, em vez de informações detalhadas sobre os professores e classes correspondentes. Entretanto, mesmo com os dados armazenados desta forma, podemos juntar as tabelas desde que cada tabela tenha um conjunto de colunas que identifique de forma única cada registro.

Chegou a hora de algumas consultas SQL!

Exemplo 1: SQL JOIN by Two Columns

Em nosso primeiro exemplo, queremos saber o nível de instrução do professor para cada aluno. Para isso, precisamos combinar as informações das tabelas students e teachers. Infelizmente, não temos a coluna de identificação do professor no students mesa. No entanto, temos o primeiro e último nome do professor em ambas as mesas. Desde que não tenhamos professores com nomes completos idênticos, podemos juntar com segurança estas duas colunas. Aqui está a pergunta:

SELECT s.first_name, s.last_name, s.teacher_first_name, s.teacher_last_name, t.education AS teacher_education
FROM students s
JOIN teachers t
ON s.teacher_first_name = t.first_name AND s.teacher_last_name = t.last_name;

Se você precisar de uma atualização na sintaxe SQL JOIN, confira esta grande folha de SQL JOIN Cheat Sheet.

Observe as duas condições na cláusula ON, pois condicionamos em ambas (1) o primeiro nome da tabela de professores a ser igual ao primeiro nome do professor na tabela de alunos e (2) o sobrenome da tabela de professores a ser igual ao sobrenome do professor na tabela de alunos. Como você vê, para especificar duas condições, simplesmente colocamos ambas na cláusula ON usando a palavra-chave AND no meio.

O resultado é o seguinte:

first_namelast_nameteacher_first_nameteacher_last_nameteacher_education
MaryJonesIsabellaLopezUndergraduate
StevenMooreMariaStuartUndergraduate
DianaMillerMariaStuartUndergraduate
AnnaDavisEmmaGreyGraduate
HellenBrownOliviaTaylorGraduate
KateWilsonOliviaTaylorGraduate
JohnSmithMiaGonzalezUndergraduate
MarkAndersonSophiaStevensonUndergraduate
GracyLeeCharlotteJohnsonGraduate
SaraGarciaJasmineHarrisUndergraduate

Parece bom! Vemos agora o nível de instrução correspondente do professor para cada aluno.

Para obter mais prática com a união de tabelas em SQL, verifique esta Cláusulas JOIN em SQL curso.

Exemplo 2: SQL JOIN por Três Colunas

No exemplo anterior, vimos como unir duas mesas por duas condições. Podemos ter ainda mais condições, se necessário. Vamos ver como unir tabelas em SQL com três condições.

Agora queremos saber o nome da sala de aula onde cada aluno tocou e estudou. As informações sobre a sala de aula estão disponíveis no classes mesa.

Não temos a identificação da classe na tabela de students mesa. No entanto, temos ali três colunas que identificam de forma única uma classe quando combinadas: jardim de infância, graduation_year, class. As mesmas colunas estão presentes na tabela de classes mesa. Assim, vamos combinar students e classes usando três colunas:

SELECT s.first_name, s.last_name, c.kindergarten, c.graduation_year, c.class, c.classroom
FROM students s
JOIN classes c
ON s.kindergarten = c.kindergarten AND s.graduation_year = c.graduation_year AND s.class = c.class;

Como você pode ver, unimos as tabelas usando as três condições colocadas na cláusula ON com as palavras-chave AND no meio. Aqui está a saída:

first_namelast_namekindergartengraduation_yearclassclassroom
MarkAndersonButterfly2020BSun
JohnSmithLove & Learn2020BHappiness
StevenMooreButterfly2021CSea
MaryJonesSunshine2021AIronman
GracyLeeLove & Learn2020ALove
HellenBrownSunshine2020BSuperman
DianaMillerButterfly2021CSea
AnnaDavisSunshine2021AIronman
SaraGarciaLove & Learn2021BIronman
KateWilsonSunshine2019BLaugh

O JOIN funcionou como pretendido! Agora temos a sala de aula correspondente para cada aluno.

Se você quiser ver mais exemplos, confira este livro de receitas ao unir mesas por várias colunas.

Vamos praticar Cláusulas JOIN em SQL por Múltiplas Colunas!

O SQL JOIN é uma das ferramentas básicas para os analistas de dados que trabalham com SQL. Os bancos de dados relacionais são construídos de tal forma que os relatórios analíticos geralmente requerem a combinação de informações de várias tabelas. Você estará unindo tabelas, às vezes por uma coluna e outras vezes por duas ou mais colunas.

Como você viu, unir tabelas por várias colunas é bastante simples em SQL. Mas se você quiser ter confiança no uso de SQL JOINs, praticar com conjuntos de dados do mundo real é um fator chave de sucesso.

Recomendo começar com este curso interativo Cláusulas JOIN em SQL que inclui 93 desafios de codificação. Ele cobre os tipos mais comuns de junções como JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, e auto junções, assim como junções não-equi.

Para obter ainda mais prática com SQL JOINs e outras ferramentas SQL básicas, considere o uso do SQL de A a Z pista. Inclui 7 cursos interativos que cobrem funções SQL padrão, relatórios SQL básicos, funções de janela, expressões comuns de tabela, consultas recursivas e muito mais.

Obrigado pela leitura, e feliz aprendizado!