Clase 08 · 25 minGratis

Subconsultas y WITH

Clase 8 del curso gratis SQL desde Cero: consultas dentro de consultas. Subconsultas en el WHERE y en el FROM, columnas calculadas y tablas temporales con WITH para que el SQL largo siga siendo legible.

Toca cualquier marca ▸ 0:00 de los apuntes y el video salta a ese momento. Abrir en YouTube

Una consulta dentro de otra

Una subconsulta es un SELECT metido dentro de otro. La consulta interna calcula algo (por ejemplo, la edad promedio de una ciudad) y la general lo usa como si fuera un valor fijo . Es divide y vencerás: consultas pequeñas que se entienden solas, ensambladas en una grande .

Usamos la tabla clientes de la clase 7, que en esta versión trae la columna edad. En la base del video había un cliente por ciudad; en la nuestra hay varios, así que los promedios por ciudad sí resumen algo.

Primero, la consulta interna

Pruébalo · base clientes

Subconsulta en el WHERE

Los clientes cuya edad es mayor o igual al promedio de Quito. La subconsulta va entre paréntesis y tiene que devolver un solo valor :

Pruébalo · base clientes

En el video se filtra Quito con GROUP BY ciudad HAVING ciudad = 'Quito' ; el resultado es el mismo, y con WHERE la base no tiene que agrupar todas las ciudades para quedarse con una. Lo importante: el valor ya no está escrito a mano, depende de los datos . Si mañana llegan clientes nuevos a Quito, la consulta se ajusta sola.

Si la subconsulta devuelve una lista, se combina con IN ; lo vemos a fondo en la clase 9. Y no hay límite de anidación: una subconsulta puede tener otra dentro .

Columnas calculadas

Una condición en el SELECT crea una columna nueva que vale 1 si se cumple y 0 si no :

Pruébalo · base clientes

Subconsulta en el FROM

El resultado de una consulta también puede ser la tabla sobre la que consultas:

Pruébalo · base clientes

Funciona, pero con siete subconsultas anidadas nadie lo entiende, ni siquiera quien lo escribió, seis meses después .

WITH: tablas temporales con nombre

WITH le da nombre a una subconsulta y la deja arriba, antes de la consulta principal. Esa «tabla» solo existe mientras corre la consulta :

Pruébalo · base clientes

Es lo mismo de arriba, pero se lee de arriba abajo. Un WITH sin un SELECT después da error: le dijiste qué tabla crear, no qué hacer con ella . Y cuando algo falla, cada bloque se puede revisar por separado .

Retos de esta clase

1. Los clientes (id, nombre y edad) cuya edad supera el promedio de toda la tabla.

Reto · base clientes

2. Con WITH, las ciudades cuyo promedio de edad supera el promedio general. Una sola columna: la ciudad.

Reto · base clientes

3. El cliente más joven de cada ciudad: ciudad, nombre y edad. (Pista: una subconsulta que calcule la edad mínima por ciudad, y un join con clientes.)

Reto · base clientes

Sigue con la clase 9

IN, EXISTS, ANY y ALL

Seguir el canal de WhatsApp