## Tipos de JOIN
Vou explicar usando duas tabelas como exemplo:
- **CLIENTES** (id, nome)
- **PEDIDOS** (id, cliente_id, valor)
### 1. **INNER JOIN** (ou só JOIN)
**Retorna apenas os registros que têm correspondência em AMBAS as tabelas.**
```sql
SELECT * FROM CLIENTES c
INNER JOIN PEDIDOS p ON c.id = p.cliente_id;
**Resultado:** Só clientes que fizeram pedidos. Clientes sem pedido NÃO aparecem.
Cliente com pedido → aparece
Cliente sem pedido → não aparece
### 2. **LEFT JOIN** (ou LEFT OUTER JOIN)
**Retorna TODOS os registros da tabela da ESQUERDA + correspondências da direita.**
```sql
SELECT * FROM CLIENTES c
LEFT JOIN PEDIDOS p ON c.id = p.cliente_id;
**Resultado:** Todos os clientes. Quem não tem pedido fica com NULL nos campos de pedido.
Cliente com pedido → aparece com dados do pedido
Cliente sem pedido → aparece com NULL nos campos do pedido
### 3. **RIGHT JOIN** (ou RIGHT OUTER JOIN)
**Retorna TODOS os registros da tabela da DIREITA + correspondências da esquerda.**
```sql
SELECT * FROM CLIENTES c
RIGHT JOIN PEDIDOS p ON c.id = p.cliente_id;
**Resultado:** Todos os pedidos. Pedidos sem cliente (raro) aparecem com NULL nos campos de cliente.
Pedido com cliente → aparece com dados do cliente
Pedido sem cliente → aparece com NULL nos campos do cliente
### 4. **FULL JOIN** (ou FULL OUTER JOIN)
**Retorna TODOS os registros de AMBAS as tabelas.**
```sql
SELECT * FROM CLIENTES c
FULL JOIN PEDIDOS p ON c.id = p.cliente_id;
**Resultado:** Tudo. Clientes sem pedido e pedidos sem cliente aparecem com NULLs.
Clientes com e sem pedido → todos aparecem
Pedidos com e sem cliente → todos aparecem
### 5. **CROSS JOIN**
**Produto cartesiano: cada linha da primeira combina com TODAS da segunda.**
```sql
SELECT * FROM CLIENTES
CROSS JOIN PEDIDOS;
**Resultado:** Se 10 clientes e 100 pedidos → 1.000 registros (cada cliente com cada pedido)
### 6. **SELF JOIN**
**JOIN da tabela com ela mesma.** Útil para relações hierárquicas.
```sql
SELECT e.nome AS empregado, g.nome AS gerente
FROM FUNCIONARIOS e
LEFT JOIN FUNCIONARIOS g ON e.gerente_id = g.id;
## Resumo Visual
| Tipo | Esquerda | Direita |
| **INNER** | ✅ só correspondentes | ✅ só correspondentes |
| **LEFT** | ✅ todos | ✅ só correspondentes |
| **RIGHT** | ✅ só correspondentes | ✅ todos |
| **FULL** | ✅ todos | ✅ todos |
## Exemplo com diagrama mental
Tabela A Tabela B
┌─────┐ ┌─────┐
│ 1 │ │ 2 │
│ 2 │ │ 3 │
│ 3 │ │ 4 │
│ 5 │ │ │
└─────┘ └─────┘
INNER JOIN: [2, 3] (o que tem nos dois)
LEFT JOIN: [1, 2, 3, 5] (tudo de A)
RIGHT JOIN: [2, 3, 4] (tudo de B)
FULL JOIN: [1, 2, 3, 4, 5] (tudo de ambos)
```
## Dica prática
- **INNER JOIN**: quando só importam registros relacionados
- **LEFT JOIN**: quando não quer perder os registros da tabela principal (mais comum)
- **FULL JOIN**: quando precisa ver tudo de ambos os lados
- **RIGHT JOIN**: raro, dá pra substituir por LEFT trocando ordem das tabelas
Nenhum comentário:
Postar um comentário