Junções (JOINs)
INNER, LEFT, RIGHT, FULL OUTER JOIN e chaves estrangeiras
JOINs combinam linhas de duas ou mais tabelas com base em uma condição de relacionamento. INNER JOIN retorna apenas linhas com correspondência em ambas as tabelas. LEFT JOIN retorna todas as linhas da tabela esquerda, com NULL onde não há correspondência na direita.
RIGHT JOIN é o espelho do LEFT JOIN. FULL OUTER JOIN retorna todas as linhas de ambas as tabelas. CROSS JOIN retorna o produto cartesiano — todas as combinações possíveis (use com cuidado).
A condição do JOIN fica na cláusula ON. Múltiplos JOINs podem ser encadeados. Use aliases de tabela para deixar o código mais legível.
-- INNER JOIN — apenas correspondências
SELECT
p.id AS pedido_id,
c.nome AS cliente,
p.valor,
p.data
FROM pedidos p
INNER JOIN clientes c ON p.cliente_id = c.id;
-- LEFT JOIN — todos os clientes, mesmo sem pedidos
SELECT
c.nome,
COUNT(p.id) AS total_pedidos
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
GROUP BY c.id, c.nome;
-- Encontrar clientes SEM pedidos
SELECT c.nome
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
WHERE p.id IS NULL; -- NULL indica ausência de correspondência
-- Múltiplos JOINs
SELECT
p.id,
c.nome AS cliente,
prod.nome AS produto,
ip.quantidade
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id
JOIN itens_pedido ip ON p.id = ip.pedido_id
JOIN produtos prod ON ip.produto_id = prod.id;
-- FULL OUTER JOIN
SELECT c.nome, p.id AS pedido
FROM clientes c
FULL OUTER JOIN pedidos p ON c.id = p.cliente_id;Sempre use aliases de tabela (FROM pedidos p) ao fazer JOINs — torna claro de qual tabela vem cada coluna e reduz ambiguidade.