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
- Subconsultas escalares, de linha e de tabela
- Subconsultas correlacionadas e não correlacionadas
- Expressões de tabela comuns (WITH)
- CTEs RECURSIVE para hierarquias