Dicas | Ferramentas | Notícias | Tutoriais
Entenda o que são CTEs, como funcionam e quando usar

Se você já se viu escrevendo uma query gigante, cheia de subconsultas aninhadas e difícil de entender… é aí que as CTEs (Common Table Expressions) entram em cena. Elas ajudam a organizar consultas complexas, melhorar a legibilidade e até reaproveitar resultados dentro de uma mesma query. Nesse post entenda o que são CTEs, como usar e quando.
💡O que é uma CTE
Uma CTE (Common Table Expression) é um tipo de tabela temporária lógica criada dentro da própria consulta.
Ela existe apenas durante a execução do comando SQL e não é armazenada no banco.
Em resumo:
CTEs servem para quebrar uma consulta em partes menores e mais fáceis de entender.
A estrutura básica é esta:
WITH nome_da_cte AS (
SELECT ...
FROM ...
WHERE ...
)
SELECT *
FROM nome_da_cte
WHERE ...;O que está dentro dos parênteses é a sua “subquery”, e depois você pode usar o nome da CTE como se fosse uma tabela.
Exemplo simples
Imagine que você quer ver os clientes que fizeram mais de 3 compras.
Sem CTE, poderia ficar assim:
SELECT c.nome, COUNT(p.id) AS total_pedidos
FROM clientes c
JOIN pedidos p ON p.id_cliente = c.id
GROUP BY c.nome
HAVING COUNT(p.id) > 3;Com CTE, você separa a contagem em uma etapa e deixa tudo mais organizado:
WITH pedidos_por_cliente AS (
SELECT id_cliente, COUNT(*) AS total_pedidos
FROM pedidos
GROUP BY id_cliente
)
SELECT c.nome, p.total_pedidos
FROM clientes c
JOIN pedidos_por_cliente p
ON c.id = p.id_cliente
WHERE p.total_pedidos > 3;📘 Fica mais legível, mais fácil de testar cada parte e de manter no futuro.
🤔Por que usar CTEs
✅ Melhor legibilidade — você pode dividir a lógica em blocos claros, como se fossem capítulos de um livro.
✅ Facilidade de manutenção — alterações em uma parte da query não afetam todo o restante.
✅ Reaproveitamento — em alguns bancos, é possível usar a mesma CTE várias vezes dentro da mesma consulta.
✅ Organização em pipelines — ideal quando há etapas de transformação em sequência.
Tipos de CTE
Existem dois tipos principais:
- CTEs não recursivas — as mais comuns, usadas para organizar subconsultas simples.
- CTEs recursivas — usadas quando uma query precisa “chamar a si mesma”, por exemplo, para percorrer hierarquias (como árvore de categorias, estrutura de cargos, etc.).
Exemplo de CTE recursiva:
WITH RECURSIVE hierarquia AS (
SELECT id, nome, id_pai
FROM departamentos
WHERE id_pai IS NULL
UNION ALL
SELECT d.id, d.nome, d.id_pai
FROM departamentos d
JOIN hierarquia h ON h.id = d.id_pai
)
SELECT * FROM hierarquia;⚠️Cuidados e boas práticas
- Use CTEs para clareza, não para “embelezar” queries.
Às vezes, uma subquery simples é mais eficiente. - Não abuse em consultas muito grandes.
Cada CTE pode gerar leitura e ordenação adicionais. - Analise o plano de execução.
Mesmo em bancos modernos, o otimizador pode decidir materializar (armazenar temporariamente) o resultado da CTE — o que impacta na performance. - Prefira índices e filtros claros.
CTEs ajudam a organizar, mas o desempenho continua dependendo da estrutura das tabelas.
CTE vs Subquery vs View
| Tipo | Quando usar | Duração | Persistência |
|---|---|---|---|
| CTE | Quando quer organizar uma lógica temporária e legível | Só durante a execução | ❌ |
| Subquery | Quando é algo simples e direto | Só durante a execução | ❌ |
| View | Quando a lógica será usada várias vezes | Permanente | ✅ |
💡 Dica: pense na CTE como um “rascunho interno” da query — útil e descartável.
📌Performance: o outro lado da moeda
Apesar de deixarem o SQL mais bonito e organizado, as CTEs não são sinônimo de performance.
Em alguns casos, podem até piorar o desempenho se o banco precisar processar tudo antes de aplicar os filtros.
Quer ver um exemplo real disso? 👇
Confira o post complementar:
➡️ Quando o CTE não é o herói: uma lição prática de performance no Oracle
Referencias:
Documentação Mysql
Learn Microsoft
✅Conclusão
As CTEs são uma das ferramentas mais poderosas do SQL moderno.
Elas trazem clareza, organização e facilitam o raciocínio por etapas.
Mas lembre-se: clareza e performance nem sempre andam juntas.
Use CTEs para entender melhor suas consultas — e o otimizador para entender melhor o seu banco. 😉






