// aula 03 · SQL · JOINs
Tabelas de exemplo
clientes
| id | nome |
|---|---|
| 1 | 'Ana' |
| 2 | 'Carlos' |
| 3 | 'Maria' |
| 4 | 'João' |
pedidos
| id | cliente_id | valor |
|---|---|---|
| 101 | 1 | 250.00 |
| 102 | 1 | 80.00 |
| 103 | 2 | 430.00 |
| 104 | 5 | 120.00 |
A coluna cliente_id na tabela pedidos é uma chave estrangeira (FK) que referencia o id da tabela clientes. É essa relação que o JOIN usa para cruzar os dados.
INNER JOIN — a intersecção
Retorna apenas as linhas que têm correspondência nas duas tabelas. No exemplo: Ana e Carlos têm pedidos, João não tem → João não aparece. O pedido 104 tem cliente_id=5 (não existe) → também não aparece.
SELECT c.nome, p.id AS pedido, p.valor FROM clientes c INNER JOIN pedidos p ON c.id = p.cliente_id; -- Resultado: -- Ana | 101 | 250.00 -- Ana | 102 | 80.00 -- Carlos | 103 | 430.00
LEFT JOIN — todos da esquerda
Retorna todos os registros da tabela esquerda (FROM) e os correspondentes da direita. Onde não há correspondência, preenche com NULL. Perfeito para encontrar registros sem par — ex: clientes sem pedidos.
SELECT c.nome, p.id AS pedido, p.valor FROM clientes c LEFT JOIN pedidos p ON c.id = p.cliente_id; -- Resultado: -- Ana | 101 | 250.00 -- Ana | 102 | 80.00 -- Carlos | 103 | 430.00 -- Maria | NULL | NULL ← sem pedidos -- João | NULL | NULL ← sem pedidos -- Clientes SEM nenhum pedido: SELECT c.nome FROM clientes c LEFT JOIN pedidos p ON c.id = p.cliente_id WHERE p.id IS NULL;
RIGHT JOIN — todos da direita
O espelho do LEFT JOIN — retorna todos da tabela direita (JOIN) e os correspondentes da esquerda. Na prática, pode sempre ser reescrito como um LEFT JOIN trocando a ordem das tabelas. É menos usado.
SELECT c.nome, p.id, p.valor FROM clientes c RIGHT JOIN pedidos p ON c.id = p.cliente_id; -- Resultado: todos os pedidos, com ou sem cliente -- Ana | 101 | 250.00 -- Ana | 102 | 80.00 -- Carlos | 103 | 430.00 -- NULL | 104 | 120.00 ← cliente_id=5 não existe
FULL OUTER JOIN — tudo de ambos os lados
Retorna todos os registros das duas tabelas. Onde não há correspondência, preenche com NULL. No MySQL não existe diretamente — é simulado com LEFT JOIN + UNION + RIGHT JOIN.
-- SQL Server / PostgreSQL SELECT c.nome, p.id, p.valor FROM clientes c FULL OUTER JOIN pedidos p ON c.id = p.cliente_id; -- MySQL (simulado com UNION) SELECT c.nome, p.id, p.valor FROM clientes c LEFT JOIN pedidos p ON c.id = p.cliente_id UNION SELECT c.nome, p.id, p.valor FROM clientes c RIGHT JOIN pedidos p ON c.id = p.cliente_id;
Múltiplos JOINs na mesma query
É possível unir quantas tabelas precisar em uma única query. Cada JOIN adiciona uma nova tabela. O banco vai cruzando as relações em cadeia.
-- clientes → pedidos → produtos → categorias SELECT c.nome AS cliente, p.valor AS pedido, pr.nome AS produto, cat.nome AS categoria FROM clientes c INNER JOIN pedidos p ON c.id = p.cliente_id INNER JOIN itens_pedido ip ON p.id = ip.pedido_id INNER JOIN produtos pr ON ip.prod_id = pr.id INNER JOIN categorias cat ON pr.cat_id = cat.id WHERE c.id = 1 ORDER BY p.valor DESC;