0Pricing
SQL Academy · Aula

Expressões de tabela comuns (WITH)

Reestruture consultas aninhadas em cláusulas WITH legíveis, encadeie CTEs e aprenda as regras de materialização do PostgreSQL 12+.

Expressões de tabela comuns (WITH) é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

O que é uma CTE?

Uma Expressão de Tabela Comum (CTE) é uma subconsulta nomeada definida com WITH:

WITH paid_orders AS (
  SELECT * FROM orders WHERE status = 'paid'
)
SELECT user_id, COUNT(*)
FROM paid_orders
GROUP BY user_id;

Por que usar CTEs?

Três grandes vantagens:

  • Legibilidade — divida uma consulta de 200 linhas em etapas nomeadas
  • Reutilização — faça referência ao mesmo resultado intermediário várias vezes
  • Recursão — somente CTEs permitem consultas recursivas (na próxima lição)

Encadeando CTEs

Defina várias CTEs em um único WITH e use uma na seguinte:

WITH last_30 AS (
  SELECT * FROM orders WHERE created_at >= NOW() - INTERVAL '30 days'
),
per_user AS (
  SELECT user_id, SUM(total) AS revenue FROM last_30 GROUP BY user_id
)
SELECT u.email, p.revenue
FROM users u
JOIN per_user p ON p.user_id = u.id
ORDER BY p.revenue DESC LIMIT 20;

Reutilizando uma CTE

Se o mesmo resultado intermediário for usado duas vezes, uma CTE torna a intenção evidente:

WITH recent_users AS (
  SELECT id FROM users WHERE created_at >= NOW() - INTERVAL '7 days'
)
SELECT 'new orders'  AS metric, COUNT(*) FROM orders
  WHERE user_id IN (SELECT id FROM recent_users)
UNION ALL
SELECT 'new revenue', SUM(total) FROM orders
  WHERE user_id IN (SELECT id FROM recent_users);

Materialização de CTEs (PostgreSQL ≤ 11)

Versões antigas do PG sempre materializavam a saída da CTE — criando uma barreira para o planejador. A partir do PG 12, o planejador incorpora as CTEs por padrão, a menos que você indique o contrário:

-- Force the old materialise behaviour (rarely needed):
WITH x AS MATERIALIZED (SELECT ...) ...

-- Force inlining (default):
WITH x AS NOT MATERIALIZED (SELECT ...) ...

CTEs que Modificam Dados

CTEs podem usar INSERT/UPDATE/DELETE — algo útil para mover linhas entre tabelas de forma atômica:

WITH moved AS (
  DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM moved;

CTEs em DML

RETURNING + WITH para "encontrar e agir":

WITH cancelled AS (
  UPDATE orders SET status = 'cancelled'
  WHERE created_at < NOW() - INTERVAL '14 days'
    AND status = 'pending'
  RETURNING id
)
INSERT INTO audit_log (event, order_id)
SELECT 'auto-cancel', id FROM cancelled;

Ordem de Execução

CTEs que modificam dados são executadas de forma independente no mesmo instantâneo. Cada instrução vê o estado ANTES de todas as modificações começarem — surpreendente, mas previsível.

CTEs vs Subconsultas vs Visões

Comparação:

  • Subconsulta — definida no próprio local; usada uma única vez
  • CTE — nomeada; usada várias vezes na consulta; desaparece quando a consulta termina
  • Visão — nomeada; persistente; reutilizável em várias consultas

Não use CTEs em excesso

Colocar tudo dentro de uma CTE torna as consultas mais legíveis, mas pode ocultar o custo. Com resultados intermediários enormes, o planejador pode escolher planos piores do que escolheria para um JOIN equivalente.

Recapitulação

CTEs dão nome a consultas intermediárias.

  • Melhoram a legibilidade
  • Permitem a reutilização em uma consulta
  • São necessárias para a recursão
  • São incorporadas por padrão no PG moderno

Verificação rápida

Qual palavra-chave inicia uma Expressão de Tabela Comum?

Perguntas Frequentes

A aula “Expressões de tabela comuns (WITH)” é grátis?

Sim — o texto completo de “Expressões de tabela comuns (WITH)” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “Expressões de tabela comuns (WITH)”?

Reestruture consultas aninhadas em cláusulas WITH legíveis, encadeie CTEs e aprenda as regras de materialização do PostgreSQL 12+. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Academy?

Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Expressões de tabela comuns (WITH)”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Academy?

Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Subconsultas escalares, de linha e de tabela
  2. Subconsultas correlacionadas e não correlacionadas
  3. Expressões de tabela comuns (WITH)
  4. CTEs RECURSIVE para hierarquias
← Voltar para SQL Academy