Continuación de casos de negocio
Clase 20 de 24 • Curso de SQL y MySQL 2018
Contenido del curso
CREATE
INSERT
Bash y archivos SQL
SELECT
Consultas en MySQL
Contenido Bonus
Aprende a obtener valor real de tus datos con consultas SQL claras. Desde precios promedio y desviación estándar hasta reportes finales con clientes, libros y autores, verás cómo combinar tablas, ordenar resultados y trabajar con fechas para convertir datos en información accionable.
¿Cómo explorar precios con select, order by y agregaciones?
Con una columna basta para empezar. Un simple “trae precios” permite observar el rango de valores y preparar agregaciones más útiles.
- Usa select para aislar columnas clave. Por ejemplo: precios.
- Ordena con order by price desc limit 10 para ver los más caros.
- Cambia a asc para detectar los precios más bajos.
- Calcula promedio con la función AVG y desviación estándar con STDDEV para entender dispersión.
Ejemplos de consultas:
-- Precios aislados
SELECT price FROM books;
-- Títulos y precios más caros
SELECT title, price
FROM books
ORDER BY price DESC
LIMIT 10;
-- Agregaciones globales
SELECT AVG(price) AS precio_promedio,
STDDEV(price) AS desviacion_estandar
FROM books;
Lo interesante llega al cruzar datos. Con JOIN entre libros y autores y GROUP BY por nacionalidad, obtienes precio promedio y desviación estándar por país, y además puedes contar cuántos libros aporta cada uno.
SELECT a.nationality,
COUNT(b.book_id) AS libros,
AVG(b.price) AS precio_promedio,
STDDEV(b.price) AS desviacion_estandar
FROM books AS b
JOIN authors AS a ON a.author_id = b.author_id
GROUP BY a.nationality
ORDER BY libros DESC;
Claves prácticas: - El grupo depende de una “columna pivote” bien elegida: aquí, nationality. - Si un país tiene un solo libro, la desviación estándar es 0. - Los nulos importan: una nacionalidad NULL puede concentrar muchos libros aunque falten datos del autor. - Ejemplos útiles: precio máximo visto 34.82; promedios cercanos a 22.39; Estados Unidos con 34 libros y promedio 22.12.
¿Por qué ordenar por libros en lugar de promedio?
- Porque el volumen da contexto a los promedios.
- Una media con pocos datos puede inducir a error.
- Ordenar por libros DESC prioriza nacionalidades con más representatividad.
¿Qué revelan max y min por nacionalidad?
Además del promedio, los extremos muestran la amplitud de precios por país.
-- Máximo y mínimo globales
SELECT MAX(price) AS precio_maximo,
MIN(price) AS precio_minimo
FROM books;
-- Extremos por nacionalidad
SELECT a.nationality,
MAX(b.price) AS max_por_pais,
MIN(b.price) AS min_por_pais
FROM books AS b
JOIN authors AS a ON a.author_id = b.author_id
GROUP BY a.nationality;
Observaciones prácticas: - País con un solo libro: máximo = mínimo. - Estados Unidos exhibe rango amplio: por ejemplo, de 34.82 a 10.17. - Ver extremos ayuda a detectar oportunidades (catálogo caro/barato) y anomalías.
¿Cómo elegir la columna pivote correctamente?
- Piensa en la pregunta de negocio: por país, por autor, por cliente.
- Evita ambigüedades: agrupa por la columna que resumes en pantalla.
- Revisa nulos y consistencia: afectan totales y estadísticas.
¿Cómo armar un reporte final con joins, concat y fechas?
Un reporte legible combina transacciones, clientes, libros y autores. Se recomienda LEFT JOIN desde la tabla de transactions y proyectar las columnas clave.
SELECT T.type,
B.title,
CONCAT(A.name, ' (', A.nationality, ')') AS autor
FROM transactions AS T
LEFT JOIN clients AS C ON C.client_id = T.client_id
LEFT JOIN books AS B ON B.book_id = T.book_id
LEFT JOIN authors AS A ON B.author_id = A.author_id;
Mejoras de lectura: - Usa CONCAT para mostrar “Nombre (nacionalidad)” en una sola columna. - Aplica alias claros: autor, libros, precio_promedio, etc.
Para trabajar con fechas, la función TODAYS convierte una fecha a el número de días desde el inicio de la era. Esto facilita comparaciones numéricas directas: ayer, hoy, hace X días.
-- Días desde el inicio de la era hasta ahora
SELECT TODAYS(NOW());
-- Días vividos por cliente
SELECT name, TODAYS(birthdate) AS dias_desde_origen
FROM clients;
-- “Hace cuánto” sucedió cada transacción
SELECT T.type,
B.title,
TODAYS(NOW()) - TODAYS(T.created_at) AS ago
FROM transactions AS T
LEFT JOIN books AS B ON B.book_id = T.book_id;
Ideas clave con fechas: - TODAYS(NOW()) entrega un entero usable en restas. - Diferencia de TODAYS entre hoy y created_at da el “ago” en días. - Útil para saber hace cuánto se rentó o vendió un libro. - Ejemplo real: una transacción con fecha 2018-01-01 resultó en 99 días de diferencia frente a los datos insertados hoy.
¿Qué habilidades consolidas con estos casos?
- Construir consultas con select, order by, limit y alias claros.
- Agregar con avg, stddev, count, max, min y group by.
- Cruzar tablas con join y left join a partir de una tabla clave.
- Formatear columnas con concat para resultados legibles.
- Operar fechas con todays y now para métricas de tiempo.
- Interpretar nulos, conteos y dispersión para decisiones de negocio.
¿Quieres que integremos filtros por rango de fechas, tipo de transacción o país, y generemos un dashboard mínimo con estas consultas? Comparte qué vista te serviría más.