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:
NULL.NULL onde não há (pouco suportado em alguns SGBDs).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:
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 |
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.
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.
Abaixo temos um modelo com três tabelas: FARMACIA, PRODUTO e FARMACEUTICO. Observe os campos e as chaves que conectam as tabelas:
🧩 Relacionamentos:
1:N)1:N)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;
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.
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)INNER JOIN faz a ligação entre as tabelas usando o campo CNPJ_farmaciaSuponha 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.
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).
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:
FARMACIA é a da esquerda: ela será exibida por completocod_produto e valor_produto virão
como NULLSuponha 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.
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.
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.
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;
Considere os dados abaixo:
| cod_produto | valor_produto | CNPJ_farmacia |
|---|---|---|
| 101 | 15.90 | 11111111111111 |
| 203 | 12.00 | 22222222222222 |
| 307 | 18.50 | 99999999999999 |
| 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 |
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;
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;
| CNPJ_farmacia | nome_farmacia |
|---|---|
| 11111111111111 | Droga Vida |
| 22222222222222 | Bem Estar |
| 33333333333333 | Farmácia Total |
| cod_produto | valor_produto | CNPJ_farmacia |
|---|---|---|
| 101 | 15.90 | 11111111111111 |
| 203 | 12.00 | 22222222222222 |
| 307 | 18.50 | 99999999999999 |
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! 😄
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.
Teste seus conhecimentos sobre comandos SQL com nosso jogo interativo de classificação!
🎯 Jogar Quebra-Cabeça SQL