Voltar para a lista de artigos Artigos
10 minutos de leitura

Um Guia Ilustrado de Junção Múltipla

Até agora, nossos artigos na série "An Illustrated Guide" explicaram vários tipos de junção: INNER JOINs, OUTER JOINs (LEFT JOIN, RIGHT JOIN, FULL JOIN), CROSS JOIN, se auto-adesão e não-equi se unem. Neste artigo final da série, mostramos como criar consultas SQL que correspondem a dados de várias tabelas usando um ou mais tipos de join.

Tipos de Junção em Consultas SQL

Antes de começarmos a discutir exemplos de consultas SQL que utilizam múltiplos tipos de join, vamos fazer uma breve recapitulação dos tipos de join que cobrimos até agora, apenas para ter certeza de que você entende as diferenças. Para isso, aqui está um pequeno resumo na forma de uma tabela. Dê uma olhada:

Type of JOIN Matching records from tables Explanation
INNER JOIN(JOIN)

SELECT  t.id, t.size,
t.color_id, c.id, c.color
FROM tshirt t
JOIN color c  
ON t.color_id = c.id ;

Result:

id size color_id id color
2 M 1 1 yellow
3 NULL 3 3 blue
An INNER JOIN returns records that match in both tables.
LEFT JOIN

SELECT  t.id, t.size,
t.color_id, c.id, c.color
FROM tshirt t
LEFT JOIN color c  
ON t.color_id = c.id ;

Result:

id size color_id id color
2 M 1 1 yellow
3 NULL 3 3 blue
1 S NULL NULL NULL
A LEFT JOIN returns all records from the left table, even when they do not match in the right table. Missing values become NULLs.
RIGHT JOIN

SELECT  t.id, t.size,
t.color_id, c.id, c.color
FROM tshirt t
RIGHT JOIN color c  
ON t.color_id = c.id ;

Result:

id size color_id id color
2 M 1 1 yellow
3 NULL 3 3 blue
NULL NULL NULL 2 NULL
A RIGHT JOIN returns all records from the right table, even when they do not match those in the left table. Missing values become NULLs.
FULL JOIN

SELECT  t.id, t.size,
t.color_id, c.id, c.color
FROM tshirt t
FULL JOIN color c  
ON t.color_id = c.id ;
uniões múltiplas sql

Result:

id size color_id id color
2 M 1 1 yellow
3 NULL 3 3 blue
1 S NULL NULL NULL
NULL NULL NULL 2 NULL
A FULL JOIN returns all records from both tables: left and right, even when rows do not match. Missing values become NULLs.
CROSS JOIN

SELECT  t.id, t.size,
t.color_id, c.id, c.color
FROM tshirt t
CROSS JOIN color c  ;
múltiplas uniões sql Result:

id size color_id id color
2 M 1 1 yellow
2 M 1 2 NULL
2 M 1 3 blue
3 NULL 3 1 yellow
3 NULL 3 2 NULL
3 NULL 3 3 blue
1 S NULL 1 yellow
1 S NULL 2 NULL
1 S NULL 3 blue
A CROSS JOIN returns the Cartesian product of the records from both tables. This means that each record from the left table is joined with each record from the right table. Missing values become NULLs.

Note que o resultado de cada tipo de join contém dados que vêm de tabelas tshirt e color. O tipo específico de união determina o conteúdo da tabela a ser devolvida.

O que é uma junção múltipla em SQL?

Cada consulta pode compreender zero, uma ou mais uniões. Uma junção múltipla é um uso de mais de uma junção em uma única consulta. As uniões utilizadas podem ser todas do mesmo tipo, ou seus tipos podem ser diferentes. Começaremos nossa discussão mostrando um exemplo de consulta que utiliza duas uniões do mesmo tipo. Dê uma olhada na consulta abaixo.

SELECT v.name, c.name,  p.lastname
FROM vehicle v
INNER JOIN color c ON  v.color_id = c.id
INNER JOIN person p ON v.person_id = p.id ;

A consulta invoca dois INNER JOINs a fim de juntar três tabelas: vehicle, person e color. Somente os registros que tiverem uma correspondência em cada tabela serão devolvidos. Primeiro, dê uma olhada nos conjuntos de dados que foram unidos.

Há três conjuntos de dados que correspondem a três tabelas no banco de dados: vehicle, color e personrepresentada abaixo.

person

id lastname
1 Watson
2 Miller
3 Smith
4 Brown

color

id name
1 green
2 yellow
3 blue

vehicle

id name color_id person_id
1 car 1 4
2 bicycle 2 NULL
3 motorcycle NULL 1
4 scooter 1 3

Você pode ver que cada vehicle na mesa do veículo tem uma cor, exceto para motorcycle. Cada veículo tem um proprietário designado, exceto para bicycle, que não tem proprietário. Uma das cores (blue) na tabela de veículos tem uma cor, exceto para o color tabela não é atribuída a nenhum veículo. Além disso, a motocicleta não tem uma cor disponível no banco de dados. Por outro lado, bicycle tem uma cor atribuída, mas não tem dono. Finalmente, à pessoa chamada Miller não é atribuído nenhum veículo.

Na consulta acima, utilizamos a junção múltipla para recuperar somente aqueles veículos aos quais foi atribuída tanto uma cor quanto o proprietário. O vehicle tabela tem o color_id que identifica a coluna color na tabela de cores, assim como o person_id que identifica a coluna person na mesa da pessoa.

Resultado da consulta:

name name lastname
car green Brown
scooter green Smith

Acontece que apenas dois registros correspondem aos critérios definidos pelas duas uniões internas.

A figura abaixo apresenta a seqüência em que os registros das respectivas tabelas foram unidos.

Note que todas as operações JOIN são realizadas da esquerda para a direita. No primeiro passo, as tabelas do primeiro JOIN são combinadas (tabelas vehicle e color). Como resultado, é criada uma tabela intermediária. No segundo passo, esta mesa intermediária (tratada como a mesa da esquerda) é unida a outra mesa (tabela person) utilizando o segundo JOIN.

Lembre-se que um único JOIN de qualquer tipo produz uma única tabela intermediária (comumente chamada de tabela derivada) durante uma consulta de múltiplas uniões.

Junção Mista Esquerda e Direita com Junção Interna

Também é possível combinar diferentes tipos de uniões em uma consulta multi-junta. Vamos dar um exemplo com um INNER JOIN e LEFT JOIN. Suponha que queiramos consultar nosso banco de dados para todas as pessoas que possuem um veículo colorido ou que não possuem nenhum veículo.

Intuitivamente, começaríamos com o person mesa e juntá-la com a vehicle Nesse caso, o LEFT JOIN corresponderia a cada registro da tabela usando um LEFT JOIN. person tabela com um registro do vehicle e para qualquer pessoa para a qual um registro correspondente não fosse encontrado, ele preencheria os valores em falta com NULLs. Esta junção produzirá uma lista de todas as pessoas no banco de dados com quaisquer dados de veículos associados, mesmo que elas não possuam um. Mas estamos interessados em ver apenas veículos com cores atribuídas. Isto significa que devemos usar um INNER JOIN em tabelas vehicle e color. Aqui está uma pergunta que atende a essa exigência em particular, mas será que ela faz o trabalho?

SELECT v.name vehicle_name, c.name color_name,  p.lastname
FROM person p
LEFT JOIN vehicle v ON  v.person_id = p.id
INNER JOIN color c ON v.color_id = c.id ;

Não! Esta consulta retorna o mesmo resultado que obtivemos de nossa consulta anterior (que só usou INNER JOINs). Nossa lista não inclui aqueles sem um veículo.

Resultado:

vehicle_name color_name lastname
car green Brown
scooter green Smith

Mas o que aconteceu? O INNER JOIN pulou os resultados que não correspondiam em ambas as tabelas, ou seja, na tabela derivada (criada ao juntar tabelas person e vehicle) e o color mesa. Como podemos resolver este problema?

A consulta a seguir apresenta uma das poucas soluções possíveis. Aqui a tabela derivada retorna veículos apenas com cores, e é então RIGHT JOINed com o person tabela, a fim de obter todas as pessoas.

SELECT p.lastname, v.name, c.name
FROM vehicle v
INNER JOIN color c ON  v.color_id = c.id
RIGHT JOIN person p ON v.person_id = p.id ;

Resultado:

lastname name name
Smith scooter green
Brown car green
Miller
Watson

Agora temos uma lista de todas as pessoas: as que têm veículos coloridos e as que não têm veículos. Começamos com uma INNER JOIN de mesas vehicle e color. Cada veículo incluído na tabela derivada deve ter uma cor atribuída, e é por isso que este tipo de união é apropriado. Tendo selecionado os veículos coloridos, podemos agora usar um RIGHT JOIN na tabela derivada com o person tabela, que é como obtivemos pessoas que não eram proprietários de veículos ao lado daqueles (da tabela derivada) que possuíam um veículo colorido.

Outro método para resolver este problema é utilizar um LEFT JOIN na tabela de pessoas e uma subconsulta na qual utilizamos um INNER JOIN nas tabelas. vehicle e color.

Dê uma olhada na consulta abaixo.

SELECT p.lastname, o.vehicle_name, o.color_name
FROM person p LEFT JOIN
(  SELECT v.name vehicle_name, c.name color_name, v.person_id
    FROM vehicle v
    INNER JOIN color c ON v.color_id=c.id
) o ON  o.person_id = p.id;

Juntas Mistas com Juntas Completas

Ainda outro tipo multijuntas utiliza uniões completas. Primeiro, vamos dar uma olhada em um tipo de junção múltipla com junções completas apenas.

SELECT p.lastname, v.name, c.name
FROM vehicle v
FULL JOIN color c ON  v.color_id = c.id
FULL JOIN person p ON v.person_id = p.id ;

A consulta acima corresponde aos registros de três tabelas: person, vehicle e color de tal forma que mesmo os registros sem uma correspondência nas outras duas tabelas aparecerão na tabela de resultados. As colunas vazias serão preenchidas com valores NULL. É por isso que a consulta retorna todas as pessoas independentemente de terem um veículo, todos os veículos independentemente de terem uma cor atribuída, e todas as cores independentemente de estarem atribuídas a qualquer veículo.

Resultado:

lastname name name
Smith scooter green
Brown car green
bicycle yellow
blue
Watson motorcycle
Miller

Usamos uniões completas para juntar todos os registros, mesmo aqueles que não correspondem. Lembre-se de que as uniões completas retornam todos os registros, enquanto as uniões internas retornam apenas aquelas que combinam.

A figura abaixo explica a seqüência em que as tabelas foram unidas.

FULL JOIN também pode aparecer em uma consulta com outro tipo de união, criando assim uma junção múltipla com tipos mistos. A consulta abaixo faz uso de um FULL JOIN com um INNER JOIN.

SELECT p.lastname, v.name, c.name
FROM vehicle v
INNER  JOIN color c ON  v.color_id = c.id
FULL  JOIN person p ON v.person_id = p.id ;

Esta consulta nos permite recuperar uma lista de todas as pessoas, sejam ou não proprietários de veículos, e todos os veículos que têm uma cor atribuída.

Veja como funcionam as duas uniões:

Primeiro, tabelas vehicle e color são combinados usando um INNER JOIN. Em seguida, a tabela derivada é combinada com o person utilizando uma tabela FULL JOIN. Aqui está o resultado:

lastname name name
Smith scooter green
Brown car green
bicycle yellow
Watson
Miller

Resumo

Uma única consulta SQL pode unir duas ou mais tabelas. Quando há três ou mais tabelas envolvidas, as consultas podem usar um único tipo de join mais de uma vez, ou podem usar vários tipos de join. Ao usar tipos de junção múltipla, devemos considerar cuidadosamente a seqüência de junções para produzir o resultado desejado. Os exemplos apresentados neste artigo demonstram claramente como uma pequena mudança no tipo de união (ou, no caso de múltiplas uniões, a ordem em que elas aparecem na consulta) pode alterar completamente o resultado da consulta, fazendo ou quebrando o sucesso da consulta.

A quais combinações de uniões devemos prestar especial atenção? INNER JOINs com OUTER JOINs, e OUTER JOINs com OUTER JOINs. Cada uma destas combinações pode produzir resultados errôneos quando utilizada de forma inadequada.

Saiba mais sobre SQL

O conhecimento básico de SQL Joins é uma necessidade absoluta, mas a maioria dos iniciantes em SQL se sentem intimidados pelas declarações JOIN. A verdade é que não há absolutamente nada a temer!

Neste artigo, discutimos como usar múltiplas junções em uma única consulta: LIKE ou tipos mistos JOIN. Mais informações sobre uniões podem ser encontradas no material abrangente da Academia Vertabelo SQL. Nos cursos, você aumentará muito sua experiência, testando e aperfeiçoando suas novas habilidades através dos exercícios práticos interativos fornecidos. Comece do curso SQL para Iniciantes se você não tiver nenhum conhecimento prévio de SQL. Acesse o curso SQL JOINs para obter prática prática prática em várias tabelas através de toneladas de exercícios interativos em declarações JOIN. Experimente agora de graça!