JOINs combinam dados de múltiplas tabelas. INNER, LEFT, RIGHT, FULL - cada um para cenário específico. Entenda com exemplos visuais.
Conceitos Principais
INNER JOIN
Retorna rows que têm match nas duas tabelas. Interseção. Mais comum. SELECT * FROM orders INNER JOIN users ON orders.user_id = users.id.
LEFT JOIN
Todos da tabela esquerda + matches da direita. NULLs onde sem match. SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id.
RIGHT JOIN
Todos da tabela direita + matches da esquerda. Raramente usado (inverter LEFT é mais claro).
FULL OUTER JOIN
Todos de ambas tabelas. NULLs onde sem match. União. Raro em apps.
Passo a Passo
- Setup Tables: CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR); CREATE TABLE orders (id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), total DECIMAL);
- INNER JOIN: SELECT users.name, orders.total FROM users INNER JOIN orders ON users.id = orders.user_id. Apenas users com orders.
- LEFT JOIN: SELECT users.name, orders.total FROM users LEFT JOIN orders ON users.id = orders.user_id. Todos users, orders NULL se não tem.
- Multiple JOINs: SELECT users.name, orders.total, products.name FROM users JOIN orders ON users.id = orders.user_id JOIN order_items ON orders.id = order_items.order_id JOIN products ON order_items.product_id = products.id;
- Performance: Índices em foreign keys. EXPLAIN mostra join type (nested loop, hash join). Avoid Cartesian product (sem ON clause).
Boas Praticas
Recomendacoes
• Índices em join columns
• Especifique colunas ao invés de SELECT *
• Use aliases para claridade
• LEFT JOIN quando precisar de NULLs
• EXPLAIN para verificar performance
• Evite joins desnecessários
Erros Comuns
Evite estes erros
• JOIN sem ON clause (cartesian product)
• Sem índices em foreign keys
• SELECT * com múltiplos joins (muita data)
• RIGHT JOIN (confuso, use LEFT)
• Joins desnecessários
Checklist
- Tabelas com foreign keys
- INNER JOIN funcionando
- LEFT JOIN testado
- Índices em join columns
- EXPLAIN executado
- Queries otimizadas