Alura > Cursos de Data Science > Cursos de SQL e Banco de Dados > Conteúdos de SQL e Banco de Dados > Primeiras aulas do curso Praticando SQL: combinando dados com JOINs

Praticando SQL: combinando dados com JOINs

Combinando dados com JOINS - Cláusulas JOIN

Boas-vindas a mais um curso prático de SQL, desta vez combinando dados utilizando as cláusulas JOIN.

Meu nome é Afonso Rios, sou instrutor na Escola de Dados da Alura e vamos explorar esse processo juntos.

Audiodescrição: Afonso é um homem de pele morena, com cabelos e olhos castanhos escuros, e barba. Ele veste uma camisa preta com o logo da Alura. Ao fundo, há uma parede com iluminação esverdeada e decorações que remetem tanto à Alura quanto ao futebol.

Neste vídeo, realizaremos operações de junção em álgebra relacional utilizando SQL. O objetivo é combinar colunas de uma ou mais tabelas de um banco de dados relacional, realizando ações essenciais para profissionais que trabalham com combinação e análise de dados. Isso aumenta o potencial nas análises e adequa os dados para a ação desejada.

O que são JOINs?

JOINs são expressões que realizam operações de junção para criar conjuntos, que podem se tornar tabelas ou serem utilizados como estão. Alguns formatos comuns de JOINs são:

Vamos trabalhar com cada um deles neste vídeo, aplicando-os a necessidades específicas.

INNER JOIN

Começaremos com o INNER JOIN. Se observarmos o diagrama de Venn, a parte azul escura representa a interseção dos dados entre a tabela A (à esquerda) e a tabela B (à direita). O INNER JOIN combina as linhas dessas duas tabelas quando há correspondência entre as colunas especificadas, calculando a interseção dos dados.

Imagem de um diagrama de Venn com dois círculos parcialmente sobrepostos. O círculo à esquerda é rotulado com a letra 'A', e o da direita com a letra 'B'. A área de interseção dos dois círculos é destacada em azul. Abaixo do diagrama, está o texto: 'Combina linhas de duas tabelas quando há correspondência entre as colunas especificadas'. O fundo da imagem é preto.

Utilizaremos duas tabelas: Funcionários (F) e Departamentos (D).

A tabela Funcionários possui três colunas: ID, nome do funcionário e departamento_id, que indica o departamento onde o funcionário trabalha. A tabela Departamentos contém os IDs dos departamentos e seus nomes, como Recursos Humanos, Desenvolvimento, Marketing, Vendas e Suporte Técnico.

Funcionários

idnomedepartamento_id
101Igor Nascimento1
102Marcelo Cruz2
103Danielle Oliveira3
104Tiago de Freitas4
105Pedro DragoNULL

Departamentos

idnome_departamento
1Recursos Humanos
2Desenvolvimento
3Marketing
4Vendas
5Suporte Técnico

No código do INNER JOIN, selecionamos as colunas Nome (da tabela Funcionários) e nome do departamento. Queremos associar o nome do funcionário ao departamento em que trabalha, trazendo Funcionários à esquerda e Departamentos à direita.

SELECT
    f.nome,
    d.nome_departamento
FROM funcionarios AS f
INNER JOIN departamentos AS d ON f.departamento_id = d.id;

Para calcular o INNER JOIN, usamos a cláusula INNER JOIN de departamentos e especificamos onde queremos constatar a interseção dos valores: f.departamento_id (ID do departamento na tabela Funcionários) e d.id (ID do departamento na tabela Departamentos). Quando os valores são iguais, ocorre a associação.

O resultado mostra que, dos cinco funcionários, apenas quatro aparecem, pois Pedro não tinha um departamento associado. O INNER JOIN trouxe a interseção, mostrando que Igor é de Recursos Humanos, Marcelo é de Desenvolvimento, Danielle é de Marketing e Tiago é de Vendas.

nomenome_departamento
Igor NascimentoRecursos Humanos
Marcelo CruzDesenvolvimento
Danielle OliveiraMarketing
Tiago de FreitasVendas

RIGHT JOIN

Agora, vamos para o RIGHT JOIN. Como o nome sugere, ele retorna todas as linhas da tabela à direita e as correspondentes à esquerda.

Imagem de um diagrama de Venn sobre um fundo preto. Há dois círculos sobrepostos com contornos azuis. O círculo da esquerda é preto com a letra 'A' em branco, e o círculo da direita é azul com a letra 'B' em branco. Abaixo do diagrama, há o texto: 'Retorna todas as linhas da tabela da direita e as suas correspondentes da esquerda', com as palavras 'direita' e 'esquerda' em negrito.

A única alteração no código é substituir INNER JOIN por RIGHT JOIN.

SELECT
    f.nome,
    d.nome_departamento
FROM funcionarios AS f
RIGHT JOIN departamentos AS d ON f.departamento_id = d.id;

O resultado mostra os cinco funcionários, incluindo Pedro, que está com NULL, e os cinco departamentos. Como estamos usando RIGHT JOIN, todos os dados da tabela Departamentos são incluídos, mesmo que não haja correspondência na tabela Funcionários.

Resultado da consulta com RIGHT JOIN

nomenome_departamento
Igor NascimentoRecursos Humanos
Marcelo CruzDesenvolvimento
Danielle OliveiraMarketing
Tiago de FreitasVendas
NULLSuporte Técnico

LEFT JOIN

Algo semelhante ocorre com o LEFT JOIN, que retorna todas as linhas da tabela à esquerda e as correspondentes à direita.

Imagem de um diagrama de Venn mostrando duas interseções. O círculo à esquerda é azul e contém a letra 'A'. O círculo à direita é preto e contém a letra 'B'. Abaixo do diagrama, há um texto em branco que diz 'Retorna todas as linhas da tabela da esquerda e as suas correspondentes da direita' em um fundo preto.

A única mudança no código é substituir RIGHT JOIN por LEFT JOIN.

SELECT
    f.nome,
    d.nome_departamento
FROM funcionarios AS f
LEFT JOIN departamentos AS d ON f.departamento_id = d.id;

O resultado mostra Recursos Humanos, Desenvolvimento, Marketing e Vendas, mas não Suporte Técnico. Em compensação, Pedro aparece, com o nome do departamento como NULL, pois não há correspondência.

Resultado da consulta com LEFT JOIN

nomenome_departamento
Igor NascimentoRecursos Humanos
Marcelo CruzDesenvolvimento
Danielle OliveiraMarketing
Tiago de FreitasVendas
Pedro DragoNULL

Se quisermos incluir todos, utilizamos o FULL JOIN.

FULL JOIN

FULL JOIN combina as linhas de ambas as tabelas presentes na consulta, trazendo tudo da esquerda, da direita e o que está combinado entre elas.

Imagem de dois círculos azuis sobrepostos em um fundo preto, representando um diagrama de Venn. O círculo da esquerda contém a letra 'A' e o círculo da direita contém a letra 'B'. A interseção dos círculos simboliza a combinação dos conjuntos. Abaixo do diagrama, há o texto em branco: 'Combina as linhas de ambas as tabelas presentes na consulta'.

A única mudança no código é substituir LEFT JOIN ou RIGHT JOIN por FULL JOIN.

SELECT
    f.nome,
    d.nome_departamento
FROM funcionarios AS f
FULL JOIN departamentos AS d ON f.departamento_id = d.id;

O resultado inclui todos os nomes e departamentos, preenchendo com NULL onde não há correspondência.

Resultado da consulta com FULL JOIN

nomenome_departamento
Igor NascimentoRecursos Humanos
Marcelo CruzDesenvolvimento
Danielle OliveiraMarketing
Tiago de FreitasVendas
Pedro DragoNULL
NULLSuporte Técnico

FULL JOIN exclusivo

Se quisermos identificar o que não está presente em ambas as tabelas, usamos o FULL JOIN exclusivo. Ele retorna todas as linhas da tabela da direita e da esquerda que não coincidem nas colunas especificadas.

'Diagrama de Venn com dois círculos azuis sobre fundo azul escuro. O círculo à esquerda contém a letra 'A' e o da direita a letra 'B'. A interseção entre os dois círculos é preta. Abaixo dos círculos, o texto diz: 'Retorna todas as linhas da tabela da direita e da esquerda que não coincidem nas colunas especificadas'.'

Para diferenciar da tabela que tínhamos anteriormente, criamos uma nova tabela chamada funcionarios_2. Nesta tabela, inseri um registro com ID 106, nome Rodrigo Dias, e departamento 6.

idnomedepartamento_id
101Igor Nascimento1
102Marcelo Cruz2
103Danielle Oliveira3
104Tiago de Freitas4
105Pedro DragoNULL
106Rodrigo Dias6

Não existe um departamento 6 na tabela de departamentos. Vamos ver o que acontece quando adiciono essa nova linha do Rodrigo Dias com valor 6.

Executando o código, a única alteração que faço é manter tudo até a parte do FULL JOIN e adicionar uma cláusula WHERE.

Essa cláusula WHERE vai verificar se na f_2 (nossa tabela funcionarios_2), o departamento ID tem valor nulo. Ou, se no ID do departamento tem valor nulo. Ele vai verificar onde não tem um, onde não tem outro. E se não tiver um ou outro, nos dois casos, ele vai trazer esse resultado.

SELECT  
    f_2.nome,  
    d.nome_departamento  
FROM funcionarios_2 AS f_2  
FULL JOIN departamentos AS d ON f_2.departamento_id = d.id  
WHERE f_2.departamento_id IS NULL OR d.id IS NULL;

Aplicando esse código, obtemos o seguinte resultado.

Resultado da consulta com FULL JOIN exclusivo

nomenome_departamento
Pedro DragoNULL
Rodrigo DiasNULL
NULLSuporte Técnico

Já tínhamos percebido dois casos que ocorreram anteriormente. O primeiro é o Pedro Drago sendo nulo, porque o Pedro existe na tabela A, mas não existe na tabela B, o departamento ao qual ele pertence.

O suporte técnico é o mesmo caso. Então, teremos o suporte técnico, mas não teremos o nome. No caso de Rodrigo, que tinha o valor 6, ele vai aparecer como nulo, porque não existe o valor 6 de ID do departamento na coluna de departamentos.

Portanto, ele vai retornar esse resultado como nulo, porque não vai encontrar essa relação. Isso facilita quando queremos encontrar inconsistências nos nossos dados.

O FULL JOIN exclusivo tem essa qualidade para quando precisamos analisar os dados que possuímos, sobre as tabelas que temos dentro do nosso banco de dados relacional.

Mas esses não são os únicos casos. Existe mais um que é bem interessante, que é o CROSS JOIN.

CROSS JOIN

Diferente do FULL JOIN, que precisa de uma coluna para determinar o que vai encaixar, o CROSS JOIN vai pegar cada linha da primeira tabela (tabela esquerda, por exemplo) e vai combinar com todas as linhas da tabela direita. Isso é chamado, dentro da álgebra relacional, de "produto cartesiano".

markdown
'Imagem de um diagrama de Venn com dois círculos azuis sobre um fundo preto. O círculo à esquerda está rotulado com a letra 'A' e o círculo à direita com a letra 'B'. Os círculos se sobrepõem no centro. Abaixo do diagrama, há um texto em branco que diz: Cada linha da primeira tabela é combinada com todas as linhas da segunda tabela (produto cartesiano), com as palavras 'combinada com todas as linhas' em negrito.

Há muitas coisas interessantes que podemos fazer com o CROSS JOIN. Vou trazer um caso diferente, porque se utilizarmos no caso anterior, teremos respostas que não fazem muito sentido.

Então, trouxe outro exemplo em que tenho uma tabela chamada produtos e uma tabela chamada garantias. Produtos será P e garantias G. O que estou fazendo? Quero calcular todas as possibilidades de valores que posso pagar por um produto.

Produtos

idnome_produtopreco
100Smartphone1500.00
200Notebook3000.00
300Tablet850.00

Garantias

iddescricaopreco_adicional
11 ano de garantia extra100.00
22 anos de garantia extra150.00

Temos o smartphone (smartphone) que custa R$1.500, notebook que custa R$3.000 e tablet (tablet) que custa R$850. E temos a descrição da garantia de um ano extra sendo R$100 e dois anos de garantia extra sendo R$150. O que quero saber? Quanto custará um smartphone com um ano de garantia, um smartphone com dois anos, um notebook com um ano, um notebook com dois anos. Quanto vai valer cada um desses?

Isso vou fazer nessa relação e consigo montar essa tabela com todos os valores possíveis, utilizando o CROSS JOIN. De uma maneira bem mais simples do que teria que fazer manualmente esse ajuste.

Usaremos o seguinte código:

SELECT  
    p.nome_produto,  
    p.preco,  
    g.descricao,  
    g.preco_adicional,  
    (p.preco + g.preco_adicional) AS preco_total  
FROM produtos AS p  
CROSS JOIN garantias AS g;

Executando o código SQL, ele vai dizer o seguinte: vou pegar da coluna de produtos o nome do produto, da coluna de produtos vou trazer o preço, da tabela de garantias vamos trazer a descrição e também da tabela de garantias vou trazer o preço adicional.

Por fim, vamos uma outra coluna chamada preço mais preço adicional, então vou somar o preço do produto mais os preços das garantias e vou criar uma coluna chamada preço total.

Vou explicar isso no produto de garantia e, como podemos ver, o cross join aqui, garantia, exagerar, não tem uma cláusula 1, porque não é necessário. Ele vai fazer o produto entre todos esses valores, vai pegar todos os valores juntos. Então, ao executar esse nosso código, ele constrói essa tabela para nós.

Resultado da consulta com CROSS JOIN

nome_produtoprecodescricaopreco_adicionalpreco_total
Smartphone15001 ano de garantia extra1001600
Smartphone15002 anos de garantia extra1501650
Notebook30001 ano de garantia extra1003100
Notebook30002 anos de garantia extra1503150
Tablet8501 ano de garantia extra100950
Tablet8502 anos de garantia extra1501000

Assim, conseguimos ver todas as possibilidades: smartphone valendo R$1600, se for um ano de garantia R$1650, se for dois anos de garantia; um tablet valendo R$950 para um ano ou valendo R$1000 para dois anos de garantia. Bem interessante, não é?

Com isso, conseguimos trazer de uma forma bem rápida toda essa combinação dos nossos dados que podem ter várias valências dentro da análise de dados.

Resumo

Passamos por todos esses tipos de combinação de dados e de concatenação. Podemos fazer o INNER JOIN, RIGHT JOIN, LEFT JOIN, FULL JOIN e CROSS JOIN e entender um pouco do potencial de cada um deles.

No entanto, também existem outras formas que faz sentido você pesquisar e procurar para entender como pode aplicá-las no seu contexto.

Deixaremos uma atividade com material para você estudar. Você pode também reassistir o vídeo para entender o processo de cada uma delas separadamente.

Além disso, vamos deixar atividades para que você possa testar casos de cada uma delas para se sentir mais confiante dentro do tema e conseguir realizar esses processos quando precisar utilizar dentro do seu projeto.

Caso tenha dúvidas, não hesite em usar tanto a comunidade do Discord como também o fórum do curso.

Espero que tenha gostado desse material. Te espero numa próxima!

Sobre o curso Praticando SQL: combinando dados com JOINs

O curso Praticando SQL: combinando dados com JOINs possui 14 minutos de vídeos, em um total de 13 atividades. Gostou? Conheça nossos outros cursos de SQL e Banco de Dados em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda SQL e Banco de Dados acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas