Escrevendo sua primeira CTE
Aprenda a sintaxe básica de WITH e quando uma CTE melhora a legibilidade em relação a uma subconsulta.
Escrevendo sua primeira CTE é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 1 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 Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
O que uma CTE realmente é
Uma Expressão de Tabela Comum (CTE) é um conjunto de resultados temporário e nomeado, definido com a palavra-chave WITH, que existe apenas durante uma única consulta. Os entrevistadores adoram CTEs porque elas revelam se você consegue estruturar a lógica com clareza.
Pense em uma CTE como uma forma de dar um nome a uma subconsulta para que você possa referenciá-la como uma tabela na instrução principal seguinte. Ela não cria um objeto permanente e desaparece assim que a consulta termina.
A sintaxe básica de WITH
Toda CTE começa com WITH, um nome, a palavra-chave AS e uma consulta entre parênteses. Depois do parêntese de fechamento, escreva uma instrução normal que use a CTE pelo nome.
WITH cte_name AS ( ... )define o bloco.- A consulta logo depois do parêntese é a consulta principal.
- O nome da CTE funciona como uma tabela da qual você pode fazer SELECT.
WITH recent_orders AS (
SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
)
SELECT *
FROM recent_orders;Por que não usar apenas uma subconsulta?
A mesma lógica pode ser escrita como uma subconsulta incorporada na cláusula FROM. Então, por que os entrevistadores fazem perguntas sobre CTEs?
- Legibilidade: uma etapa nomeada é lida de cima para baixo como uma receita.
- Reutilização: você pode referenciar a mesma CTE várias vezes, em vez de repetir uma subconsulta.
- Facilidade de depuração: você pode fazer SELECT apenas da CTE para inspecioná-la.
A resposta correta em uma entrevista geralmente é: use uma CTE quando ela tornar a consulta mais fácil de ler e manter.
Exemplo prático: filtrando e depois agregando
Suponha que a pergunta seja: encontre a receita total dos pedidos feitos este ano. Uma CTE permite isolar a etapa de filtragem e depois agregar sobre o resultado nomeado.
A consulta principal trata recent_orders como se fosse uma tabela real, o que mantém a agregação clara e direta.
WITH recent_orders AS (
SELECT amount
FROM orders
WHERE order_date >= '2024-01-01'
)
SELECT SUM(amount) AS total_revenue
FROM recent_orders;Nomeando as colunas de saída
Você pode renomear as colunas que uma CTE expõe listando-as logo depois do nome da CTE. Isso é útil quando a consulta interna produz expressões ou quando você quer nomes mais claros nas etapas seguintes.
Se você fornecer uma lista de colunas, ela deverá corresponder ao número de colunas retornadas pela consulta interna; caso contrário, o banco de dados gerará um erro.
WITH revenue (region, total) AS (
SELECT region, SUM(amount)
FROM orders
GROUP BY region
)
SELECT region, total
FROM revenue
ORDER BY total DESC;Uma CTE é apenas uma consulta nomeada
Um modelo mental que impressiona os entrevistadores: uma CTE é logicamente equivalente a substituir sua definição diretamente na consulta. O banco de dados pode optar por incorporá-la ou materializá-la, mas, semanticamente, o resultado é o mesmo que se você tivesse colado a subconsulta.
Isso significa que tudo o que é válido em um SELECT regular também é válido dentro de uma CTE: junções, GROUP BY, WHERE, funções de janela e muito mais.
Exemplo mais aprofundado: CTE com uma junção
As CTEs se destacam quando você precisa preparar antecipadamente um lado de uma junção. Aqui, primeiro criamos uma contagem de pedidos por cliente e depois a juntamos novamente à tabela de clientes para que cada linha de cliente carregue seu total.
Observe como a consulta principal se aproxima da linguagem natural: a partir dos clientes, junte suas contagens de pedidos.
WITH order_counts AS (
SELECT customer_id, COUNT(*) AS num_orders
FROM orders
GROUP BY customer_id
)
SELECT c.name, oc.num_orders
FROM customers c
JOIN order_counts oc
ON oc.customer_id = c.id;Onde uma CTE fica na consulta
O bloco WITH deve vir antes da instrução que o utiliza. A CTE fica visível apenas para a única instrução que vem imediatamente depois de sua definição.
- Você não pode referenciar uma CTE em uma consulta posterior e separada.
- Uma CTE definida para um SELECT não pode ser reutilizada por outro SELECT executado depois.
- O escopo termina com o ponto e vírgula que encerra a instrução.
CTEs funcionam com INSERT, UPDATE, DELETE
Uma pergunta frequente de acompanhamento: as CTEs não se limitam a SELECT. Na maioria dos bancos de dados modernos, você também pode anexar uma cláusula WITH a instruções de modificação de dados.
Isso permite calcular um conjunto de linhas uma vez e depois operar sobre ele, o que é muito mais claro do que uma subconsulta aninhada dentro da cláusula WHERE.
WITH stale AS (
SELECT id
FROM sessions
WHERE last_seen < NOW() - INTERVAL '30 days'
)
DELETE FROM sessions
WHERE id IN (SELECT id FROM stale);Erros comuns de iniciantes
Os entrevistadores ficam atentos a estes deslizes:
- Esquecer a consulta principal depois da CTE; um bloco
WITHsozinho não é uma instrução completa. - Colocar um ponto e vírgula entre a CTE e a consulta principal.
- Esperar que a CTE persista entre várias instruções.
- Fazer a lista opcional de nomes de colunas não corresponder às colunas da consulta interna.
Como falar sobre CTEs em uma entrevista
Quando pedirem que você refatore uma subconsulta confusa, explique seu raciocínio: Vou elevar esta subconsulta de filtragem a uma CTE chamada pedidos_recentes para que a agregação fique clara.
Demonstrar que você escolhe CTEs por clareza e reutilização, e não de forma automática, sinaliza maturidade de nível intermediário. Mencione que uma CTE não torna inerentemente uma consulta mais rápida; seu principal valor é a legibilidade.
Verificação rápida
Teste sua compreensão da sintaxe básica de CTEs e do escopo.
Recapitulação: sua primeira CTE
Você aprendeu que uma CTE usa WITH name AS ( ... ) para nomear um conjunto de resultados temporário e depois permite referenciá-lo como uma tabela na instrução seguinte.
- As CTEs melhoram a legibilidade, a reutilização e a facilidade de depuração em comparação com subconsultas incorporadas.
- O escopo é limitado a uma instrução; depois disso, elas desaparecem.
- Elas funcionam com SELECT e com INSERT/UPDATE/DELETE.
- Elas não aumentam o desempenho por si só.
Em seguida: encadeamento de várias CTEs em um fluxo.
Perguntas Frequentes
A aula “Escrevendo sua primeira CTE” é grátis?
Sim — o texto completo de “Escrevendo sua primeira CTE” é 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 Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “Escrevendo sua primeira CTE”?
Aprenda a sintaxe básica de WITH e quando uma CTE melhora a legibilidade em relação a uma subconsulta. Você pratica SQL Interview Prep 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 Interview Prep?
Nenhuma experiência prévia é necessária. SQL Interview Prep 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 1 de 4.
Quanto tempo leva a aula “Escrevendo sua primeira CTE”?
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 Interview Prep?
Sim. Cada aula de SQL Interview Prep 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
- Escrevendo sua primeira CTE
- Encadeando várias CTEs
- CTE versus subconsulta versus tabela temporária
- Refatorando consultas aninhadas em CTEs