> lección 15/18 · 16 min

CTE con WITH: consultas por pasos

Concepto

Una subconsulta dentro de otra dentro de otra se vuelve difícil de leer. WITH resuelve eso: le pone nombre a un paso intermedio arriba de la consulta, y después lo usas como si fuera una tabla. A eso se le llama CTE (Common Table Expression).

Sintaxis
WITH nombre_paso AS (
  SELECT ...
)
SELECT ... FROM nombre_paso;

Declarar el paso. WITH, el nombre, AS y la consulta entre paréntesis. Después viene la consulta principal, que lo usa en su FROM.

WITH por_estado AS (
  SELECT estado, COUNT(*) AS inscripciones
  FROM inscripciones
  GROUP BY estado
)
SELECT * FROM por_estado;

Filtrar y ordenar el resultado del paso. En la consulta principal puedes usar WHERE, ORDER BY y JOIN sobre el CTE como sobre cualquier tabla.

WITH por_estado AS (
  SELECT estado, COUNT(*) AS inscripciones
  FROM inscripciones
  GROUP BY estado
)
SELECT estado, inscripciones
FROM por_estado
WHERE inscripciones >= 2
ORDER BY inscripciones DESC;

Por qué no una subconsulta. Hace lo mismo que la subconsulta en FROM, pero se lee de arriba hacia abajo, como una receta: primero calculo esto, después lo uso. Puedes declarar varios pasos separados por comas, y cada uno puede usar los anteriores. En consultas reales de varias etapas, es la forma más usada.

> tarea SQL

Con un CTE, resume a los estudiantes por ciudad: cuántos hay (estudiantes) y su edad promedio redondeada a 1 decimal (edad_promedio). Muestra ciudad, estudiantes y edad_promedio solo de las ciudades con 2 o más estudiantes, de la edad promedio más alta a la más baja.

Tablas disponibles
  • cursos: id, titulo, nivel, horas
  • estudiantes: id, nombre, correo, edad, ciudad
  • inscripciones: id, estudiante_id, curso_id, nota, estado

Primero intenta: las pistas aparecen después de 2 intentos con un resultado incorrecto (los errores de código no cuentan). Llevas 0.

Aprueba las tareas de esta lección para ver el cierre.