SQL Intermedio · Lección 5 de 6
WITH: resolver por pasos
Las preguntas difíciles se resuelven por partes. Con WITH armás pasos con nombre, como tablas intermedias, y la consulta se lee de arriba hacia abajo.
Una tabla intermedia, sin copiar y pegar
Pensá en cómo lo harías en una planilla: primero armás una hoja con el total de cada cliente y después, sobre esa hoja, buscás a los mejores. En SQL eso se hace con WITH. Le ponés nombre a un paso (se le dice CTE) y después lo usás como si fuera una tabla más.
WITH facturacion AS (
SELECT c.nombre,
SUM(v.cantidad * p.precio) AS total
FROM ventas v
JOIN clientes c ON v.cliente_id = c.id
JOIN productos p ON v.producto_id = p.id
GROUP BY c.nombre
)
SELECT nombre,
total
FROM facturacion
WHERE total > 30000;Se lee de arriba hacia abajo: paso 1, armá facturacion con el total de cada cliente; paso 2, de facturacion, traé los que superan $30.000. Cada parte se entiende sola, y si algo no da, revisás paso por paso.
¿No podía hacerlo sin WITH?
Muchas veces sí, pero la consulta queda larga y difícil de leer. WITH no hace nada que no puedas hacer de otra forma: lo que cambia es que la persona que la lee la entiende, incluida vos dentro de tres meses. Y se pueden encadenar varios pasos separados por comas: WITH paso1 AS (…), paso2 AS (…).
Un detalle: el paso existe solo mientras corre la consulta. No se guarda en la base ni crea ninguna tabla nueva.
Actividad 1
Armá la consulta por pasos
Pregunta: "¿qué clientes compraron 10 veces o más?". Primero se arma el paso con las compras de cada cliente y después se filtra. Tocá las piezas en orden.
Actividad 2
Los mejores clientes
Tres misiones por pasos. El editor ya trae el paso facturacion armado: ejecutalo para empezar.
ventas:idINTEGERfechaDATEcliente_idINTEGERproducto_idINTEGERsucursal_idINTEGERcantidadINTEGERPrimer paso: explorar toda la tabla
Antes de escribir tu consulta, conviene mirar la tabla completa. Esta consulta trae todas las columnas (eso significa el asterisco) y todas las filas:
SELECT * FROM ventas;
Cargando la tabla…
Cada fila es una compra: cuándo, quién, qué, en qué sucursal y cuántas unidades. Fijate que cliente_id, producto_id y sucursal_id no son nombres: son números que apuntan a otra tabla. Para traer esos nombres se usa JOIN.
Hacelo siempre como primer paso cuando trabajes con una tabla nueva. Si la tabla es enorme, sumale LIMIT 20 para ver solo una muestra, como viste en SQL Inicial.
productos:idINTEGERnombreTEXTcategoriaTEXTprecioREALstockINTEGERPrimer paso: explorar toda la tabla
Antes de escribir tu consulta, conviene mirar la tabla completa. Esta consulta trae todas las columnas (eso significa el asterisco) y todas las filas:
SELECT * FROM productos;
Cargando la tabla…
Mirándola te ubicás: qué columnas hay, cómo están escritos los textos (por ejemplo, 'Lácteos' con mayúscula y tilde) y entre qué valores andan los números. Con eso armás tu consulta sin adivinar. Su id es el número que aparece en ventas.producto_id.
Hacelo siempre como primer paso cuando trabajes con una tabla nueva. Si la tabla es enorme, sumale LIMIT 20 para ver solo una muestra, como viste en SQL Inicial.
clientes:idINTEGERnombreTEXTbarrioTEXTtelefonoTEXTPrimer paso: explorar toda la tabla
Antes de escribir tu consulta, conviene mirar la tabla completa. Esta consulta trae todas las columnas (eso significa el asterisco) y todas las filas:
SELECT * FROM clientes;
Cargando la tabla…
Cada fila es una persona que compra en el almacén. Su id es el número que aparece en ventas.cliente_id.
Hacelo siempre como primer paso cuando trabajes con una tabla nueva. Si la tabla es enorme, sumale LIMIT 20 para ver solo una muestra, como viste en SQL Inicial.
- 1Con
WITH, armá un paso llamadofacturacioncon elnombrede cada cliente y sutotalfacturado. Después mostrá todo lo que tiene. - 2Usando ese mismo paso, mostrá los 3 clientes que más facturaron, del mayor al menor (nombre y total).
- 3Armá un paso con cuántas veces compró cada cliente y, con un CASE, contá cuántos son
'frecuente'(10 compras o más) y cuántos'ocasional'.
Tu misión, las tablas, los mensajes y la ayuda están en el panel de la izquierda.
Tocá Ejecutar para ver el resultado.
Chequeo rápido
Después de ejecutar una consulta con WITH, ¿qué pasa con el paso que armaste?
Que la IA te explique una consulta larga, paso por paso
En el trabajo te vas a encontrar consultas de muchas líneas. Pedile a Gemini que te las traduzca:
Explicame esta consulta paso por paso, primero cada WITH y después el SELECT final, como si fuera la primera vez que leo SQL: [pegá acá la consulta]
Que te la explique no reemplaza entenderla: después ejecutala vos y mirá cada paso por separado.
WITH nombre AS (…) arma un paso intermedio que después usás como una tabla. Sirve para resolver preguntas grandes por partes y para que la consulta se lea de arriba hacia abajo.Ya resolvés problemas por pasos