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.
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.
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.
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
id nome departamento_id 101 Igor Nascimento 1 102 Marcelo Cruz 2 103 Danielle Oliveira 3 104 Tiago de Freitas 4 105 Pedro Drago NULL
Departamentos
id nome_departamento 1 Recursos Humanos 2 Desenvolvimento 3 Marketing 4 Vendas 5 Suporte 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.
nome | nome_departamento |
---|---|
Igor Nascimento | Recursos Humanos |
Marcelo Cruz | Desenvolvimento |
Danielle Oliveira | Marketing |
Tiago de Freitas | Vendas |
Agora, vamos para o RIGHT JOIN. Como o nome sugere, ele retorna todas as linhas da tabela à direita e as correspondentes à esquerda.
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
nome nome_departamento Igor Nascimento Recursos Humanos Marcelo Cruz Desenvolvimento Danielle Oliveira Marketing Tiago de Freitas Vendas NULL Suporte Técnico
Algo semelhante ocorre com o LEFT JOIN, que retorna todas as linhas da tabela à esquerda e as correspondentes à direita.
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
nome nome_departamento Igor Nascimento Recursos Humanos Marcelo Cruz Desenvolvimento Danielle Oliveira Marketing Tiago de Freitas Vendas Pedro Drago NULL
Se quisermos incluir todos, utilizamos o 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.
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
nome nome_departamento Igor Nascimento Recursos Humanos Marcelo Cruz Desenvolvimento Danielle Oliveira Marketing Tiago de Freitas Vendas Pedro Drago NULL NULL Suporte Técnico
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.
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.
id | nome | departamento_id |
---|---|---|
101 | Igor Nascimento | 1 |
102 | Marcelo Cruz | 2 |
103 | Danielle Oliveira | 3 |
104 | Tiago de Freitas | 4 |
105 | Pedro Drago | NULL |
106 | Rodrigo Dias | 6 |
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
nome nome_departamento Pedro Drago NULL Rodrigo Dias NULL NULL Suporte 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.
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".
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
id nome_produto preco 100 Smartphone 1500.00 200 Notebook 3000.00 300 Tablet 850.00
Garantias
id descricao preco_adicional 1 1 ano de garantia extra 100.00 2 2 anos de garantia extra 150.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_produto preco descricao preco_adicional preco_total Smartphone 1500 1 ano de garantia extra 100 1600 Smartphone 1500 2 anos de garantia extra 150 1650 Notebook 3000 1 ano de garantia extra 100 3100 Notebook 3000 2 anos de garantia extra 150 3150 Tablet 850 1 ano de garantia extra 100 950 Tablet 850 2 anos de garantia extra 150 1000
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.
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!
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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.