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.