Resumen

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.