🔗 Semana 6 - Junções (INNER JOIN, LEFT JOIN, RIGHT JOIN)

<
🔗 Tópico 1 – O que são junções (JOIN)

Em um banco de dados relacional, os dados são distribuídos em diferentes tabelas, organizados de forma a evitar redundância e garantir integridade. Para consultar informações combinadas de duas ou mais tabelas relacionadas, usamos as chamadas junções (JOINs).

As junções utilizam campos em comum (chaves primárias e estrangeiras) para "conectar" registros entre tabelas. Veja os principais tipos:

  • INNER JOIN: retorna apenas os registros que têm correspondência em ambas as tabelas. É o tipo mais comum.
  • LEFT JOIN (ou LEFT OUTER JOIN): retorna todos os registros da tabela da esquerda, e os registros correspondentes da direita. Quando não há correspondência, os campos da direita vêm como NULL.
  • RIGHT JOIN (ou RIGHT OUTER JOIN): retorna todos os registros da tabela da direita, e os correspondentes da esquerda (menos usado em alguns bancos como o MySQL).
  • FULL JOIN: retorna todos os registros das duas tabelas, combinando onde há correspondência e preenchendo com NULL onde não há (pouco suportado em alguns SGBDs).
❓ O que é "tabela da esquerda" e "da direita"?

Em uma junção SQL, a tabela da esquerda é a que aparece antes do JOIN, e a tabela da direita é a que vem depois. Isso influencia no comportamento de LEFT e RIGHT JOIN.


SELECT ...
FROM FARMACIA
LEFT JOIN PRODUTO ON FARMACIA.CNPJ_farmacia = PRODUTO.CNPJ_farmacia;
        

Nesse exemplo:

  • FARMACIA é a tabela da esquerda
  • PRODUTO é a tabela da direita

Assim, um LEFT JOIN garante que todas as farmácias apareçam, mesmo que não tenham produtos. Um RIGHT JOIN garantiria o contrário: todos os produtos, mesmo que sem farmácia associada.

JOIN Registros garantidos Campos da outra tabela
INNER JOIN Somente os com correspondência Combinados
LEFT JOIN Todos da esquerda NULL se não houver da direita
RIGHT JOIN Todos da direita NULL se não houver da esquerda
FULL JOIN Todos de ambas NULL quando não houver par
🎨 Visualizando os JOINs com teoria de conjuntos

A imagem abaixo representa visualmente o funcionamento de cada tipo de junção em bancos de dados relacionais. Ela utiliza diagramas de conjuntos para mostrar quais registros são retornados em uma consulta com INNER JOIN, LEFT JOIN, RIGHT JOIN e FULL JOIN.

Diagrama explicativo dos tipos de JOIN

Figura – Representação visual dos tipos de JOIN em SQL.

✅ As junções são extremamente úteis para gerar relatórios, relacionar clientes com compras, alunos com turmas, farmácias com produtos, entre muitos outros casos.


📘 Exemplo aplicado: Modelo físico de uma farmácia

Abaixo temos um modelo com três tabelas: FARMACIA, PRODUTO e FARMACEUTICO. Observe os campos e as chaves que conectam as tabelas:

🧩 Relacionamentos:

  • Uma farmácia pode ter vários produtos (1:N)
  • Uma farmácia pode ter vários farmacêuticos (1:N)
  • As tabelas se relacionam pelo campo CNPJ_farmacia

🎯 Exemplo de junção para listar produtos e sua farmácia:


SELECT f.nome_farmacia, p.cod_produto, p.valor_produto
FROM FARMACIA f
INNER JOIN PRODUTO p ON f.CNPJ_farmacia = p.CNPJ_farmacia;
        
🔎 Tópico 2 – INNER JOIN na prática

O INNER JOIN é o tipo mais comum de junção. Ele retorna somente os registros que possuem correspondência em ambas as tabelas envolvidas na consulta.

Ou seja, se uma farmácia não tiver produtos cadastrados, ela não aparecerá no resultado de um INNER JOIN entre as tabelas FARMACIA e PRODUTO. Da mesma forma, um produto que não esteja vinculado a nenhuma farmácia (sem CNPJ_farmacia correspondente) também será excluído do resultado.

🔁 Isso é útil quando você deseja trabalhar apenas com dados que têm vínculo confirmado entre as tabelas.


🧪 Exemplo prático

Suponha que queremos listar os produtos cadastrados, com seus respectivos valores e a farmácia à qual pertencem.


SELECT 
    f.nome_farmacia,
    p.cod_produto,
    p.valor_produto
FROM 
    FARMACIA f
INNER JOIN 
    PRODUTO p ON f.CNPJ_farmacia = p.CNPJ_farmacia;
        

🔍 Explicação da consulta:

  • FARMACIA f é a tabela da esquerda (apelidada como f)
  • PRODUTO p é a tabela da direita (apelidada como p)
  • O INNER JOIN faz a ligação entre as tabelas usando o campo CNPJ_farmacia
  • O resultado trará apenas os produtos que têm farmácia correspondente, e apenas farmácias que têm pelo menos um produto cadastrado

📌 Resultado esperado:

Suponha que existam os seguintes dados:

nome_farmacia cod_produto valor_produto
Droga Vida 101 15.90
Droga Vida 102 23.50
Bem Estar 203 12.00

🚫 Importante: Farmácias sem produtos não aparecem. Produtos sem farmácia também não.

🟢 Use INNER JOIN sempre que quiser garantir que os dados de ambas as tabelas estejam relacionados diretamente.

⬅️ Tópico 3 – LEFT JOIN na prática

O LEFT JOIN (ou LEFT OUTER JOIN) retorna todos os registros da tabela da esquerda, mesmo que não tenham correspondência na tabela da direita.

Quando não há correspondência, os campos da tabela da direita aparecem com valor NULL.

🧭 A tabela “da esquerda” é a que vem antes do LEFT JOIN. A tabela “da direita” é a que vem depois.

Esse tipo de junção é útil quando você quer listar todos os dados de uma tabela principal (como farmácias), mesmo que algumas não estejam relacionadas a dados complementares (como produtos).


🧪 Exemplo prático

Vamos listar todas as farmácias, e os produtos que elas têm (se tiverem). Mesmo que uma farmácia não tenha nenhum produto, ela aparecerá no resultado.


    SELECT 
        f.nome_farmacia,
        p.cod_produto,
        p.valor_produto
    FROM 
        FARMACIA f
    LEFT JOIN 
        PRODUTO p ON f.CNPJ_farmacia = p.CNPJ_farmacia;
            

🔍 Explicação da consulta:

  • A tabela FARMACIA é a da esquerda: ela será exibida por completo
  • Se a farmácia não tiver produtos, os campos cod_produto e valor_produto virão como NULL
  • Se tiver produtos, esses campos serão preenchidos normalmente

📌 Resultado esperado:

Suponha que existam as seguintes farmácias e produtos:

Tabela FARMACIA:

CNPJ_farmacia nome_farmacia
11111111111111 Droga Vida
22222222222222 Bem Estar
33333333333333 Saúde Total

Tabela PRODUTO:

cod_produto valor_produto CNPJ_farmacia
101 15.90 11111111111111
203 12.00 22222222222222

Resultado da consulta:

nome_farmacia cod_produto valor_produto
Droga Vida 101 15.90
Bem Estar 203 12.00
Saúde Total NULL NULL

🟢 Use LEFT JOIN quando quiser incluir todos os dados da tabela principal, mesmo que não haja correspondência.

➡️ Tópico 4 – RIGHT JOIN na prática (O primo menos famoso)

Se o LEFT JOIN fosse o irmão mais velho, popular e responsável, o RIGHT JOIN seria aquele primo que aparece menos nos almoços de domingo... mas que também tem seu valor! 😄

O RIGHT JOIN (ou RIGHT OUTER JOIN) funciona exatamente como o LEFT JOIN, mas com os papéis invertidos.

🔄 Regra de Ouro: Ele retorna todos os registros da tabela da direita (a que vem depois do JOIN), mesmo que não tenham correspondência na da esquerda.

Se não houver correspondência, os campos da tabela da esquerda aparecem como NULL. Isso pode acontecer, por exemplo, se um produto foi cadastrado, mas a farmácia correspondente foi excluída.

🧠 Dica mental para lembrar:
RIGHT JOIN = a consulta se preocupa em manter tudo da tabela da direita na tela. A da esquerda entra apenas se houver vínculo.

🧪 Exemplo prático:

Vamos listar todos os produtos cadastrados, mesmo que a farmácia correspondente não exista mais no cadastro. É como listar todos os remédios perdidos no mundo sem saber de onde vieram. 😅


SELECT 
    f.nome_farmacia,
    p.cod_produto,
    p.valor_produto
FROM 
    FARMACIA f
RIGHT JOIN 
    PRODUTO p ON f.CNPJ_farmacia = p.CNPJ_farmacia;
📌 Resultado esperado:

Considere os dados abaixo:

💊 PRODUTO
cod_produto valor_produto CNPJ_farmacia
101 15.90 11111111111111
203 12.00 22222222222222
307 18.50 99999999999999
🏥 FARMACIA
CNPJ_farmacia nome_farmacia
11111111111111 Droga Vida
22222222222222 Bem Estar

🔍 Resultado da consulta:

nome_farmacia cod_produto valor_produto
Droga Vida 101 15.90
Bem Estar 203 12.00
NULL 307 18.50
📣 RIGHT JOIN: porque até os dados "sem origem" merecem aparecer no relatório. 😆
🧩 Tópico 5 – FULL JOIN: Quando tudo (e todos) importam

O FULL JOIN (ou FULL OUTER JOIN) é o mais inclusivo de todos os JOINs. Ele retorna todos os registros da tabela da esquerda e da tabela da direita, combinando os dados onde houver correspondência e preenchendo com NULL onde não houver.

💡 Pense assim: é como montar uma lista completa de presença para dois grupos — todos os que participaram de qualquer um dos grupos, mesmo que estejam só em um deles.

📌 Sintaxe geral:


SELECT ...
FROM tabela_esquerda
FULL JOIN tabela_direita
ON condição_de_junção;
        
🎯 Exemplo aplicado – Misturando tudo

Vamos simular um cenário onde há farmácias e produtos, mas nem todos os produtos têm farmácias associadas e nem todas as farmácias têm produtos cadastrados. Queremos ver todos!

🧪 Consulta SQL:


SELECT 
    f.nome_farmacia,
    p.cod_produto,
    p.valor_produto
FROM 
    FARMACIA f
FULL JOIN 
    PRODUTO p ON f.CNPJ_farmacia = p.CNPJ_farmacia;
        
📋 Tabelas de exemplo
🏥 FARMACIA
CNPJ_farmacia nome_farmacia
11111111111111 Droga Vida
22222222222222 Bem Estar
33333333333333 Farmácia Total
💊 PRODUTO
cod_produto valor_produto CNPJ_farmacia
101 15.90 11111111111111
203 12.00 22222222222222
307 18.50 99999999999999
📈 Resultado da consulta

Combinação completa das duas tabelas:

nome_farmacia cod_produto valor_produto
Droga Vida 101 15.90
Bem Estar 203 12.00
Farmácia Total NULL NULL
NULL 307 18.50

📣 FULL JOIN: porque todo mundo merece ser lembrado, até os dados esquecidos! 😄

Diagrama de teoria de conjuntos para JOINs

Figura – Representação visual do FULL JOIN (regiões combinadas).

✅ Agora você já conhece todos os tipos de junção em SQL e pode navegar com tranquilidade entre tabelas relacionadas.

🎮 Prática Interativa

Teste seus conhecimentos sobre comandos SQL com nosso jogo interativo de classificação!

🎯 Jogar Quebra-Cabeça SQL