Expresiones de Tablas Comunes (CTE) en SQL

Clase 30 de 36Curso de Bases de Datos con SQL - Deprecado

Contenido del curso

Resumen

Cuando trabajas con procesos de ETL (extracción, transformación y carga) o ELT (extracción, carga y transformación), el paso de transformación suele generar consultas cada vez más extensas y difíciles de mantener. SQL ofrece una funcionalidad diseñada específicamente para resolver este problema: las CTE (Common Table Expressions), que permiten dividir una consulta compleja en partes más pequeñas y legibles.

¿Qué son las CTE y por qué mejoran tus consultas SQL?

Durante la transformación de datos se aplican reglas de negocio, se generan indicadores, estadísticas y se realizan operaciones avanzadas que involucran múltiples tablas, funciones aritméticas y condicionales [0:42]. Esto provoca que las consultas crezcan en complejidad rápidamente.

Las CTE resuelven este problema al ofrecer tres ventajas claras:

  • Legibilidad del código: dividen una consulta grande en subconsultas con nombres descriptivos.
  • Facilidad de mantenimiento: cada subconsulta se puede modificar de forma independiente.
  • Entendimiento de negocio: el nombre de cada CTE refleja el proceso que realiza, lo cual facilita la colaboración entre desarrolladores [1:07].

Una CTE está compuesta por subconsultas que agrupan la lógica en bloques pequeños, y una consulta principal que relaciona y consume los resultados de esas subconsultas.

¿Cómo se escribe la estructura básica de una CTE?

La sintaxis comienza con la palabra reservada WITH, seguida del nombre que identifica a la CTE. Este nombre debe hacer referencia directa al proceso de negocio que representa, como buena práctica de nomenclatura [2:07]. Luego se utiliza AS acompañado de paréntesis que encierran la consulta interna.

sql WITH nombre_de_la_cte AS ( SELECT columna1, columna2 FROM tabla WHERE condicion ) SELECT * FROM nombre_de_la_cte;

La consulta interna puede ser tan simple como un SELECT * FROM o tan avanzada como necesites, incluyendo JOIN, condicionales y funciones aritméticas [2:40]. La consulta principal aparece al final y hace referencia a la CTE por su nombre en la cláusula FROM, en lugar de una tabla convencional.

¿Se pueden usar múltiples subconsultas en una sola CTE?

Sí. Puedes definir varias subconsultas separándolas con una coma antes de la consulta principal [4:28]. Cada subconsulta puede incluso hacer referencia a otra subconsulta definida previamente dentro de la misma CTE. También es posible relacionarlas utilizando INNER JOIN, LEFT JOIN o RIGHT JOIN en la consulta principal [3:14].

¿Cómo aplicar una CTE para calcular el salario promedio?

El escenario práctico utiliza una base de datos con dos tablas: departamento de empleados y datos del empleado [1:42]. La CTE calcula el salario promedio agrupado por departamento y la consulta principal filtra los resultados.

sql WITH promedio_salarios AS ( SELECT d.nombre_departamento, AVG(e.salario) AS promedio_salario FROM empleados e JOIN departamentos d ON e.departamento_id = d.id GROUP BY d.nombre_departamento ) SELECT * FROM promedio_salarios WHERE promedio_salario > 65000;

En este ejemplo [3:27], la subconsulta usa JOIN para relacionar las tablas, GROUP BY para agrupar por departamento y la función AVG para obtener el promedio. La consulta principal aplica un condicional WHERE sobre el resultado renombrado como promedio_salario, filtrando únicamente los departamentos cuyo promedio supera los 65,000.

¿Qué buenas prácticas considerar al escribir CTE?

  • Nombra cada CTE según su funcionalidad de negocio, no con nombres genéricos.
  • Utiliza alias claros y consistentes para las tablas referenciadas.
  • Recuerda que los resultados de cualquier subconsulta están disponibles tanto en otras subconsultas como en la consulta principal [4:10].

Ahora que conoces la estructura y aplicación práctica de las CTE, ¿puedes identificar la mala práctica de renombramiento de tablas en el ejemplo mostrado? Comparte tu respuesta e intenta crear una CTE con dos o más subconsultas relacionadas entre sí.