Cursos › Decisiones basadas en datos: de la pregunta a la respuesta
Tu primera consulta de verdad sobre los pedidos de Alpenkorb
Lección 5 de 8 · 13 min
La forma de toda consulta
Has ejecutado consultas pequeñas en los primeros cuatro laboratorios. Esta lección pone las piezas en orden, porque casi toda consulta de análisis tiene el mismo esqueleto.
SELECT columns or calculations FROM table WHERE conditions on rows ORDER BY sort columns LIMIT number of rows;
SQL ejecuta las cláusulas en un orden distinto al que las escribes. Primero FROM elige la tabla, luego WHERE quita filas, luego SELECT calcula las columnas, luego ORDER BY ordena y LIMIT corta. Por eso WHERE no puede filtrar por un nombre que creas en SELECT, mientras que ORDER BY sí puede ordenar por él.
Filtros que encajan con el negocio
Lena quiere saber si los códigos de descuento compran cestas más grandes. En la tabla orders, discount_code contiene códigos como WELCOME10 para un primer pedido o AFFILIATE15 de sitios asociados, y está vacío cuando no se usó ningún código. En SQL un valor vacío es NULL, que significa desconocido, y necesita su propia prueba.
SELECT order_id, order_date, source, discount_code, net_amount FROM orders WHERE status = 'delivered' AND discount_code IS NOT NULL AND order_date >= '2026-01-01' ORDER BY net_amount DESC LIMIT 3;
discount_code = NULL no devolvería ninguna fila. Comparar cualquier cosa con desconocido da desconocido, y WHERE mantiene solo las filas donde la condición es verdadera. Usa en su lugar IS NULL e IS NOT NULL.
ANDexige todas las condiciones,ORal menos una. Cuando las combinas, añade paréntesis:WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').INes una forma corta para variosOR:region IN ('Bern', 'Basel').- Las comparaciones de texto necesitan comillas simples y la ortografía exacta. Las regiones se escriben
'Zurich','Geneva'y'St. Gallen'.
Tres pequeños errores causan la mayoría de las primeras consultas fallidas. Los valores de texto usan comillas simples: en DuckDB "delivered" entre comillas dobles significa una columna llamada delivered, y la consulta falla. Las fechas se escriben como texto en formato ISO, '2026-01-01', que DuckDB compara correctamente con una columna de fecha. Y una coma que falta o sobra entre columnas produce un error de sintaxis cerca de la siguiente palabra.
La trampa del status
La tabla orders contiene cada pedido jamás hecho, incluidos 67 cancelados y 80 devueltos. Su net_amount sigue estando relleno, porque el importe se conocía cuando se hizo el pedido. Si olvidas status = 'delivered', los ingresos salen demasiado altos. En el primer trimestre de 2026 ese error convierte CHF 37'107.20 en CHF 38'787.67. El error tampoco se reparte de forma uniforme: las cancelaciones y las devoluciones son más frecuentes en algunas fuentes que en otras.
¿Qué mostró la pregunta sobre los descuentos? En el primer trimestre de 2026, 90 de los 648 pedidos entregados usaron un código. Su valor medio fue CHF 57.16, frente a CHF 57.28 para los pedidos sin código. Con esta evidencia, los códigos no compran cestas más grandes. Puede que aun así ganen nuevos clientes, lo cual es una pregunta distinta y necesita una consulta distinta. Antes de confiar en cualquier resultado, compara su número de filas con un número que ya conoces: el laboratorio de la lección 2 devolvió 648 pedidos entregados para este trimestre, así que un filtro sobre el mismo trimestre nunca puede devolver más.
SELECT * FROM orders LIMIT 10, añade un filtro, ejecútalo, comprueba el número de filas, luego añade el siguiente. Una consulta larga escrita de una vez y ejecutada una sola vez esconde sus errores.WHERE discount_code = NULL no devuelve ninguna fila?Inicia sesión para responder y seguir tu progreso.
Iniciar sesión