Se você é desenvolvedor SQL, certamente já deve ter se deparado com a necessidade de criar consultas complexas, que envolvem múltiplas tabelas, junções e subconsultas. Em alguns casos, essas consultas podem se tornar muito longas e difíceis de entender, especialmente quando precisam ser reutilizadas em outros lugares do seu código. É nesse contexto que os Common Table Expressions (CTEs) se tornam uma ferramenta muito útil para simplificar e otimizar suas consultas SQL.

Neste artigo, vamos explorar o que são as CTEs, como elas funcionam e como você pode usá-las para melhorar a legibilidade e a eficiência do seu código SQL.


O que são as CTEs em SQL?

Uma CTE é uma tabela temporária que você pode criar dentro de uma consulta SQL e usar como se fosse uma tabela normal. A principal diferença entre uma CTE e uma tabela comum é que a CTE não é armazenada fisicamente no banco de dados. Em vez disso, ela é criada dinamicamente toda vez que a consulta que a utiliza é executada.

As CTEs são uma alternativa às subconsultas (também conhecidas como “subqueries”), que são consultas aninhadas dentro de outras consultas SQL. As subconsultas podem ser difíceis de entender e manter, especialmente quando elas precisam ser reutilizadas em várias partes do seu código. As CTEs resolvem esse problema, permitindo que você defina uma consulta auxiliar em uma CTE e, em seguida, a use em outras partes da sua consulta principal.

Como funcionam as CTEs?

As CTEs são definidas usando a cláusula WITH, seguida pelo nome da CTE e a definição da consulta auxiliar. Aqui está um exemplo simples de como criar uma CTE que retorna uma lista de clientes:

WITH clientes AS (

   SELECT nome, email, cidade 

   FROM tabela_clientes

   WHERE cidade = ‘São Paulo’

)

SELECT * FROM clientes;

Neste exemplo, estamos criando uma CTE chamada “clientes”, que é uma consulta que retorna todos os clientes que moram em São Paulo. Em seguida, estamos usando essa CTE em uma consulta principal que retorna todos os dados dos clientes na CTE.

Uma CTE pode referenciar outras CTEs ou tabelas dentro da mesma consulta. Aqui está um exemplo mais complexo que usa duas CTEs e uma junção para obter uma lista de pedidos e seus itens correspondentes:

WITH pedidos AS (

   SELECT id_pedido, id_cliente, data_pedido

   FROM tabela_pedidos

   WHERE data_pedido BETWEEN ‘2022-01-01’ AND ‘2022-12-31’

), itens_pedido AS (

   SELECT id_pedido, nome_produto, quantidade

   FROM tabela_itens_pedido

)

SELECT p.data_pedido, i.nome_produto, i.quantidade

FROM pedidos p

JOIN itens_pedido i ON p.id_pedido = i.id_pedido

WHERE p.id_cliente = 1234;


Neste exemplo, estamos criando duas CTEs: “pedidos”, que retorna uma lista de pedidos feitos em 2022, e “itens_pedido”, que retorna uma lista de itens em cada pedido. Em seguida, estamos usando essas CTEs em uma consulta principal que junta os resultados e calcula o total de cada item em cada pedido.

Exemplo de utilização de CTEs


Para exemplificar a utilização de CTEs, vamos considerar um cenário onde temos uma tabela chamada produtos, com os seguintes campos: id, nome, preço e categoria. 

Queremos fazer uma consulta que retorne o nome dos produtos e o total de vendas de cada categoria, ordenados pela categoria que teve mais vendas.

Com a utilização de CTEs, podemos escrever uma consulta mais legível e organizada. Veja o código abaixo:

WITH vendas_por_categoria AS (

  SELECT categoria, SUM(preco) AS total_vendas

  FROM produtos

  GROUP BY categoria

)

SELECT p.nome, vpc.total_vendas

FROM produtos p

JOIN vendas_por_categoria vpc ON p.categoria = vpc.categoria

ORDER BY vpc.total_vendas DESC

Primeiro, declaramos a CTE vendas_por_categoria, que é uma subconsulta que retorna o total de vendas por categoria. Em seguida, fazemos um join entre a tabela produtos e a CTE vendas_por_categoria para obter o total de vendas de cada produto. Por fim, ordenamos o resultado pelo total de vendas de cada categoria, em ordem decrescente.

Observe como a consulta fica mais legível e organizada, tornando mais fácil entender o que está sendo feito em cada parte da consulta.

Conclusão

CTEs são uma ferramenta poderosa para simplificar consultas SQL complexas e melhorar a legibilidade do código. Elas permitem que você defina subconsultas nomeadas que podem ser referenciadas em outras partes da consulta. 

Além disso, CTEs podem melhorar o desempenho de consultas complexas, pois o otimizador de consultas do banco de dados pode reutilizar a CTE em diferentes partes da consulta.

Ao usar CTEs, é importante lembrar que elas são tratadas pelo banco de dados como subconsultas, portanto, podem afetar o desempenho da consulta, dependendo de como são escritas. No entanto, se usadas corretamente, as CTEs podem ser uma ferramenta valiosa para simplificar suas consultas SQL e melhorar a legibilidade do seu código.

Obrigado por ler até aqui! Esperamos que este artigo tenha sido útil e informativo para você. Se gostou, compartilhe-o com seus amigos e colegas. Até a próxima

Comments are closed.

× Falar com Especialista!