Aprende SQL

Expresiones de tabla comunes: CTEs

Una CTE (Common Table Expression) es una consulta temporal con nombre que puedes definir antes de tu consulta principal usando la palabra clave WITH. Piensa en ella como una variable que almacena un resultado intermedio para usarlo después.

Sin CTE (difícil de leer)
SELECT developer, total
FROM (
SELECT developer,
COUNT(*) AS total
FROM videogames
GROUP BY developer
)
WHERE total > 1;
vs
Con CTE (claro y reutilizable)
CTE
WITH conteo AS (
SELECT developer,
COUNT(*) AS total
FROM videogames
GROUP BY developer
)
SELECT * FROM conteo
WHERE total > 1;

Sintaxis básica

WITH nombre_cte AS (
  SELECT ...
)
SELECT * FROM nombre_cte;

La CTE se define entre WITH y el SELECT principal. El nombre que le des funciona como si fuera una tabla temporal que solo existe durante esa consulta.

¿Por qué usar CTEs?

Compara estas dos consultas que buscan desarrolladores con más de un juego:

Sin CTE (subconsulta anidada):

SELECT developer, total
FROM (
  SELECT developer, COUNT(*) AS total
  FROM videogames
  GROUP BY developer
)
WHERE total > 1;

Con CTE (mucho más legible):

WITH conteo AS (
  SELECT developer, COUNT(*) AS total
  FROM videogames
  GROUP BY developer
)
SELECT developer, total
FROM conteo
WHERE total > 1;

El resultado es idéntico, pero la versión con CTE es más fácil de leer, depurar y mantener. Le das un nombre descriptivo al paso intermedio y la consulta principal queda limpia.

Múltiples CTEs

Puedes definir varias CTEs separadas por comas:

WITH
juegos_largos AS (
  SELECT title, developer, playtime_hours
  FROM videogames
  WHERE playtime_hours > 50
),
conteo_devs AS (
  SELECT developer, COUNT(*) AS total
  FROM videogames
  GROUP BY developer
)
SELECT j.title, j.playtime_hours, c.total
FROM juegos_largos j
JOIN conteo_devs c ON j.developer = c.developer;

Cada CTE puede referenciar a las CTEs definidas antes de ella, lo que permite construir consultas complejas paso a paso.

CTEs vs subconsultas

CaracterísticaCTE (WITH)Subconsulta
LegibilidadMuy alta, con nombre descriptivoPuede ser difícil de seguir si se anida
ReutilizaciónSe puede usar varias veces en la misma consultaHay que repetir la subconsulta
RecursividadSoporta WITH RECURSIVENo
RendimientoSimilar en la mayoría de casosSimilar en la mayoría de casos

Tip: Usa CTEs cuando la subconsulta sea compleja o cuando necesites reutilizar el mismo resultado intermedio en varias partes de la consulta.

Nuestra tabla

Nombre de la Tabla: videogames
idtitledeveloperyearplaytime_hours
1The Legend of ZeldaNintendo198620
2Super Mario Bros.Nintendo198510
3Final Fantasy VIISquare Enix199740
4The Witcher 3CD Projekt Red2015100
5MinecraftMojang Studios20119999
6Grand Theft Auto VRockstar Games201380
7Dark SoulsFromSoftware201160
8Portal 2Valve20118
9Red Dead Redemption 2Rockstar Games201870
10The Last of UsNaughty Dog201315
11Halo: Combat EvolvedBungie200110
12God of WarSanta Monica Studio201825

Ejercicios