Refatorando consultas aninhadas em CTEs
Aprenda um padrão de entrevista ao vivo: transformar uma consulta aninhada ilegível em CTEs passo a passo.
Refatorando consultas aninhadas em CTEs é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 4 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
A refatoração em uma entrevista ao vivo
Um enunciado clássico para nível intermediário: aqui está uma consulta; torne-a legível. O entrevistador entrega um SELECT profundamente aninhado e observa como você o divide. Transformar o aninhamento em uma sequência de CTEs nomeadas é a resposta mais organizada.
Esta lição percorre exatamente essas etapas para que você consiga executá-las com tranquilidade em um quadro branco.
Comece pela consulta mais interna
Subconsultas aninhadas são executadas conceitualmente de dentro para fora. Portanto, leia a consulta da mesma forma: encontre primeiro o SELECT mais interno entre parênteses; essa é a primeira etapa do seu fluxo.
Dê a ele um nome descritivo e transforme-o em uma CTE. Tudo que referenciava aquele bloco interno passa a referenciar o nome da CTE.
SELECT *
FROM (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
) t
WHERE t.total > 1000;Promova um nível a uma CTE
Pegue essa tabela derivada mais interna e transforme-a em uma CTE. A consulta externa permanece igual, exceto pelo fato de agora selecionar a partir da CTE nomeada.
Essa única ação já remove um nível de aninhamento mental e dá à etapa um nome significativo.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
)
SELECT *
FROM spend
WHERE total > 1000;Um exemplo realmente aninhado
Veja um exemplo mais difícil de refatorar: dois níveis de aninhamento e um filtro semelhante a uma correlação. O objetivo é calcular o valor médio dos pedidos entre os clientes da faixa de maior gasto.
A consulta está correta, mas é difícil de ler. Vamos separá-la etapa por etapa.
SELECT AVG(o.amount) AS avg_order
FROM orders o
WHERE o.customer_id IN (
SELECT customer_id
FROM (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
) s
WHERE s.total > 1000
);Dê um nome à primeira etapa
O bloco mais interno calcula o gasto total por cliente. Transforme-o em uma CTE chamada spend. Agora, a camada intermediária simplesmente filtra essa CTE.
Observe como cada extração reduz a profundidade do aninhamento em um nível e acrescenta um nome autoexplicativo.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
)
SELECT AVG(o.amount) AS avg_order
FROM orders o
WHERE o.customer_id IN (
SELECT customer_id FROM spend WHERE total > 1000
);Dê um nome à segunda etapa
Extraia o filtro sobre spend para sua própria CTE, big_spenders. A consulta principal restante se torna uma junção simples ou um teste de pertencimento em relação a um conjunto claramente nomeado.
Agora cada etapa tem uma única responsabilidade, característica fundamental de um SQL organizado.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders GROUP BY customer_id
),
big_spenders AS (
SELECT customer_id FROM spend WHERE total > 1000
)
SELECT AVG(o.amount) AS avg_order
FROM orders o
JOIN big_spenders b ON b.customer_id = o.customer_id;Preserve a semântica durante a refatoração
A regra de ouro: uma refatoração não deve alterar os resultados. Fique atento às armadilhas que modificam a saída silenciosamente:
- Trocar
INporJOINpode introduzir linhas duplicadas se o lado direito não for distinto. NOT INcom valores nulos se comporta de forma diferente deNOT EXISTS.- A granularidade da agregação deve permanecer a mesma.
Diga esses riscos em voz alta para demonstrar cuidado.
Verifique a refatoração
Como provar que a refatoração é fiel? Mencione que você executaria as duas versões e compararia a quantidade de linhas e uma soma de verificação, ou compararia os conjuntos de resultados em uma amostra.
Em uma entrevista, até mesmo dizer Eu validaria comparando as quantidades e algumas linhas escolhidas demonstra uma disciplina de engenharia que vai além de simplesmente reescrever a sintaxe.
SELECT COUNT(*), SUM(amount)
FROM orders
WHERE customer_id IN (SELECT customer_id FROM big_spenders);Quando NOT refatorar
A refatoração nem sempre é uma melhoria. Talvez seja mais claro deixar uma única subconsulta simples como está, e dividi-la em muitas CTEs pequenas também pode prejudicar a legibilidade.
Use seu discernimento: refatore quando o aninhamento ocultar a intenção ou quando a lógica for reutilizada. Diga ao entrevistador que você pararia quando a consulta pudesse ser lida de cima para baixo como etapas distintas e nomeadas.
A lista de verificação da refatoração
Um método que você pode recitar:
- Leia de dentro para fora para encontrar a subconsulta mais profunda.
- Transforme-a em uma CTE nomeada.
- Repita o processo para cima, uma camada por vez.
- Dê a cada etapa um nome que indique o que ela produz.
- Confirme que os resultados não mudaram (observe as armadilhas de IN/JOIN e NULL).
Isso transforma uma consulta aninhada assustadora em uma reescrita tranquila e passo a passo.
Comunicando sua refatoração
Fale enquanto trabalha: O bloco mais interno representa os gastos por cliente, então vou chamá-lo de gastos. A camada seguinte filtra os clientes que gastam muito. Depois, a consulta externa calcula a média dos valores dos pedidos deles.
Os entrevistadores avaliam a comunicação tanto quanto a correção. Uma refatoração narrada, etapa por etapa, mostra exatamente a maturidade intermediária que eles procuram.
Verificação rápida
Identifique o primeiro passo correto ao refatorar uma consulta profundamente aninhada em CTEs.
Recapitulação: refatoração em CTEs
Você aprendeu uma refatoração tranquila e repetível: ler de dentro para fora, transformar a subconsulta mais profunda em uma CTE nomeada e avançar para fora uma camada por vez.
- Dê a cada etapa um nome que indique o que ela produz.
- Preserve a semântica; observe as duplicatas de IN versus JOIN e as armadilhas de NULL.
- Valide comparando as quantidades e algumas linhas de amostra.
- Não divida demais; pare quando a consulta puder ser lida como etapas claras e nomeadas.
Isso conclui o curso de CTEs; agora você pode refatorar com confiança durante uma entrevista.
Perguntas Frequentes
A aula “Refatorando consultas aninhadas em CTEs” é grátis?
Sim — o texto completo de “Refatorando consultas aninhadas em CTEs” é 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “Refatorando consultas aninhadas em CTEs”?
Aprenda um padrão de entrevista ao vivo: transformar uma consulta aninhada ilegível em CTEs passo a passo. Você pratica Coding 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 Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding 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 4 de 4.
Quanto tempo leva a aula “Refatorando consultas aninhadas em CTEs”?
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 Coding Interview Prep?
Sim. Cada aula de Coding 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