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
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 :
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 :
Subconsulta en el FROM
El resultado de una consulta también puede ser la tabla sobre la que consultas:
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
:
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.
2. Con WITH, las ciudades cuyo promedio de edad supera el promedio
general. Una sola columna: la ciudad.
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.)
