Pular para o conteúdo
Tecnologia

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

  1. Scalar Subquery: SELECT name, (SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) AS order_count FROM users. Alternativa: LEFT JOIN com COUNT.
  2. IN Subquery: SELECT * FROM products WHERE category_id IN (SELECT id FROM categories WHERE active = true). Alternativa: JOIN.
  3. 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.
  4. Correlated: SELECT * FROM products p1 WHERE price > (SELECT AVG(price) FROM products p2 WHERE p2.category = p1.category). Roda N vezes. Use window functions.
  5. 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