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:

  1. CTEs não recursivas — as mais comuns, usadas para organizar subconsultas simples.
  2. 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

TipoQuando usarDuraçãoPersistência
CTEQuando quer organizar uma lógica temporária e legívelSó durante a execução
SubqueryQuando é algo simples e diretoSó durante a execução
ViewQuando a lógica será usada várias vezesPermanente

💡 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. 😉

Compartilhe:
Elvis Amorim

Elvis Amorim

Apaixonado por tecnologia e por compartilhar conhecimento. Tenho mais de 15 anos de experiência nas áreas de varejo, administração e informática, atuando como analista de sistemas e de dados. No TecProdutiva, reúno tudo o que aprendi para ajudar pessoas a usarem a tecnologia de forma simples e produtiva.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *