Saltar al contenido principal

7.3.3 Consultas Avanzadas y Agregación

En el mundo real, los datos no son útiles si no podemos extraer conclusiones de ellos. No basta con saber qué libros hay; necesitamos saber cuántos son de cierto autor, cuál es el más caro o filtrar aquellos que empiezan por una letra específica.

Aquí es donde el SQL brilla como un lenguaje de "declaración de intenciones": tú le dices qué quieres, no cómo encontrarlo.


1️⃣ El Arte de Filtrar: Más allá del =​

Cuando buscamos datos, a veces no conocemos el valor exacto o buscamos un rango.

🟩 Patrones con LIKE​

Permite buscar dentro de cadenas de texto usando comodines:

  • % ➡️ Sustituye a cualquier número de caracteres (incluso ninguno).
  • _ ➡️ Sustituye a exactamente un carácter.
-- Libros que empiezan por 'El'
SELECT * FROM libros WHERE titulo LIKE 'El%';

-- Libros que tienen 'an' en cualquier posición
SELECT * FROM libros WHERE autor LIKE '%an%';

🟦 Rangos y Listas (BETWEEN, IN, DISTINCT)​

  • BETWEEN: Filtra dentro de un rango inclusivo.
  • IN: Verifica si el valor está en una lista específica.
  • DISTINCT: Elimina duplicados del resultado.
-- Libros de entre 200 y 500 páginas
SELECT * FROM libros WHERE paginas BETWEEN 200 AND 500;

-- Libros de autores específicos
SELECT * FROM libros WHERE autor IN ('Isaac Asimov', 'George Orwell');

-- Listado de todos los autores (sin repetir)
SELECT DISTINCT autor FROM libros;

2️⃣ Funciones de Agregado y Agrupación​

Las funciones de agregado procesan un conjunto de filas para devolver un único valor de resumen.

🟩 Las 5 Funciones Maestras​

  • COUNT(): Cuenta registros.
  • SUM(): Suma valores numéricos.
  • AVG(): Calcula el promedio.
  • MAX() / MIN(): Encuentra el valor máximo o mínimo.
SELECT COUNT(*) AS total_libros, AVG(paginas) AS promedio_paginas FROM libros;

🟦 GROUP BY y HAVING​

Si queremos el resumen por cada autor, usamos GROUP BY. Si queremos filtrar esos grupos, usamos HAVING (el WHERE de los grupos).

-- Contar libros por cada autor
SELECT autor, COUNT(*) AS cantidad
FROM libros
GROUP BY autor;

-- Solo autores que tengan más de 5 libros registrados
SELECT autor, COUNT(*) AS cantidad
FROM libros
GROUP BY autor
HAVING cantidad > 5;

3️⃣ Orden, Límite y Paginación​

Controlar cómo y cuántos datos recibimos es vital para el rendimiento y la experiencia de usuario.

🟩 ORDER BY (Ordenación)​

-- Libros ordenados por páginas de mayor a menor
SELECT * FROM libros ORDER BY paginas DESC;

🟦 LIMIT y OFFSET (Paginación)​

Esto es lo que usan las webs para mostrar resultados "página 1, página 2...".

  • LIMIT 10: Trae solo los 10 primeros.
  • OFFSET 10: Salta los 10 primeros.
# Traer la segunda página de resultados (resultados del 11 al 20)
cursor.execute("SELECT * FROM libros LIMIT 10 OFFSET 10")

4️⃣ Alias y Subconsultas​

A veces necesitamos usar el resultado de una consulta dentro de otra.

🟩 Alias (AS)​

Sirve para dar nombres temporales y legibles a columnas calculadas o tablas.

SELECT titulo, (paginas / 10) AS tiempo_estimado_lectura FROM libros;

🟦 Subconsultas​

¿Y si quieres buscar los libros que tienen más páginas que la media? No puedes poner AVG() en un WHERE directamente. Necesitas una subconsulta:

SELECT titulo, paginas 
FROM libros
WHERE paginas > (SELECT AVG(paginas) FROM libros);

✅ Buenas prácticas en Consultas​

resumen profesional
  • Evita el SELECT *: En aplicaciones grandes, pide solo las columnas que vas a usar. Ahorra ancho de banda y memoria.
  • Alias claros: Usa AS para que tus resultados tengan nombres que se entiendan al leer el código Python.
  • Usa LIMIT: Si vas a mostrar datos en una UI, nunca traigas 10,000 filas de golpe.
  • Cuidado con LIKE: Las búsquedas que empiezan por % (ej: %texto) son lentas porque SQLite no puede usar índices para encontrarlas.

🧪 Ejercicios prácticos – Misión: La Cripta de Datos (Parte 3)​

El archivo histórico de la Cripta de Datos está creciendo. El bibliotecario jefe te pide realizar un análisis estadístico para entender "el peso del conocimiento".

🟢 Fase 1 – Búsqueda de Patrones​

🟩 Ejercicio 1 – Los Manuscritos Perdidos​

Busca todos los libros cuyo título contenga la palabra "El" o "La" (puedes usar varios LIKE u operadores OR). Muestra el resultado ordenado alfabéticamente por título.

🟦 Ejercicio 2 – La Zona de Estudio​

Muestra únicamente el título y el autor de los libros que tengan entre 300 y 600 páginas, pero salta el primer resultado encontrado (usa OFFSET).

🟡 Fase 2 – El Resumen del Sabio​

🟨 Ejercicio 3 – Estadística de Autores​

Calcula y muestra por pantalla:

  1. El número total de autores distintos que hay en la cripta.
  2. Cuántos libros hay en total.
  3. El promedio de páginas de todos los libros (redondeado a 2 decimales).

🟧 Ejercicio 4 – Rankings de Autoría​

Muestra una lista de autores junto con la cantidad de libros que tienen cada uno, ordenados de quien tiene más libros a quien tiene menos. Solo deben aparecer autores que tengan más de 1 libro.

🔴 Fase 3 – Consultas de Élite​

🟥 Ejercicio 5 – El Libro que destaca​

Utilizando una subconsulta, encuentra y muestra el título del libro (o libros) que tienen un número de páginas superior al promedio de toda la biblioteca.

🟪 Ejercicio 6 – Paginación Real​

Simula un sistema de páginas para la consola:

  1. Pregunta al usuario qué página quiere ver (ej: Página 1).
  2. Muestra los libros de 3 en 3 (Página 1: 1-3, Página 2: 4-6...).
  3. Implementa la lógica usando LIMIT y una fórmula matemática para el OFFSET basada en la página introducida por el usuario. (Fórmula: OFFSET = (pagina - 1) * limite)