Subqueries são queries dentro de queries. Poderosas mas podem ser lentas. Aprenda quando usar e alternativas performáticas.
Conceitos Principais
Scalar Subquery
Retorna single value. Usado em SELECT, WHERE. SELECT (SELECT MAX(price) FROM products) AS max_price.
Column Subquery
Retorna lista de valores. Usado com IN. WHERE user_id IN (SELECT id FROM active_users).
Table Subquery
Retorna table. Usado em FROM. SELECT * FROM (SELECT * FROM users WHERE active = true) AS active_users.
Correlated Subquery
Referencia outer query. Executa para cada row. Lento. WHERE price > (SELECT AVG(price) FROM products p2 WHERE p2.category = p1.category).
Passo a Passo
- Scalar Subquery: SELECT name, (SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) AS order_count FROM users. Alternativa: LEFT JOIN com COUNT.
- IN Subquery: SELECT * FROM products WHERE category_id IN (SELECT id FROM categories WHERE active = true). Alternativa: JOIN.
- EXISTS Subquery: SELECT * FROM users WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id). Mais rápido que IN para grandes datasets.
- Correlated: SELECT * FROM products p1 WHERE price > (SELECT AVG(price) FROM products p2 WHERE p2.category = p1.category). Roda N vezes. Use window functions.
- Optimize: EXPLAIN mostra subquery execution. Reescreva como JOIN. Use CTEs (WITH clause) para claridade. Window functions para correlacionadas.
Boas Praticas
Recomendacoes
• EXISTS ao invés de IN para grandes datasets
• CTEs (WITH) para readability
• Window functions ao invés de correlated subqueries
• Subqueries em FROM devem ter alias
• EXPLAIN para verificar performance
• Prefira JOINs quando possível
Erros Comuns
Evite estes erros
• Correlated subquery quando JOIN resolve
• IN com subquery enorme (use EXISTS)
• Subquery sem índices
• Múltiplas subqueries correlacionadas
• Não testar performance
Checklist
- Subqueries básicas funcionando
- EXISTS testado
- CTEs implementadas
- Performance comparada com JOINs
- EXPLAIN executado
- Queries otimizadas