Módulo 8 · Integración

Proyecto práctico: base de datos de una biblioteca

Aplica consultas, relaciones y resúmenes en un caso completo, paso a paso.

60–90 minNivel ProyectoAntes necesitas: Todos los módulos anteriores

0 de 45 lecciones

Al terminar, podrás

  • Explorar un esquema desconocido antes de consultar.
  • Resolver un proyecto en etapas verificables.
  • Combinar filtros, relaciones y agregaciones sin perder la cardinalidad.

Recupera lo aprendido: Después de relacionar libros con prestamos, ¿una fila sigue representando siempre un libro?

La idea clave

Trabajarás como analista de una biblioteca con tres tablas: autores, libros y prestamos. El objetivo no es escribir una consulta enorme, sino transformar preguntas en etapas pequeñas y comprobables.

Cuaderno de proyecto: para cada etapa anota la unidad de una fila, las claves usadas y una comprobación numérica.

Plan del proyecto

  1. Explora columnas y relaciones.
  2. Obtén una lista básica y valida nombres.
  3. Filtra préstamos abiertos.
  4. Resume actividad por autor.
  5. Detecta libros sin préstamos.
  6. Explica decisiones y límites del resultado.

Etapa 1 · Catálogo disponible

Empieza con una consulta de dos tablas. Una fila representa un libro disponible.

Consulta inicial
SELECT l.titulo, a.nombre AS autor
FROM libros AS l
JOIN autores AS a ON a.id = l.autor_id
WHERE l.disponible = 1
ORDER BY l.titulo;
Libros disponibles
tituloautor
Cien años de soledadGabriel García Márquez
El amor en los tiempos del cóleraGabriel García Márquez
La mano izquierda de la oscuridadUrsula K. Le Guin
RayuelaJulio Cortázar

Comprobaciones

  1. La clave es libros.autor_id = autores.id.
  2. Hay cuatro libros con disponible = 1.
  3. Gabriel García Márquez aparece dos veces porque tiene dos libros disponibles.
Comprueba tu comprensión

¿Qué representa una fila del resultado anterior?

Un error habitual

Agrupar antes de definir la unidad

Consulta problemática
SELECT a.nombre, l.titulo, COUNT(p.id)
FROM autores AS a
JOIN libros AS l ON l.autor_id = a.id
LEFT JOIN prestamos AS p ON p.libro_id = l.id
GROUP BY a.nombre;

La consulta agrupa por autor, pero selecciona un título sin definir cuál representa al grupo. Decide si quieres una fila por autor o por libro y alinea todas las columnas con esa unidad.

Etapa 2 · Préstamos abiertos

Laboratorio SQL

Resuelve la consulta

Pendiente

Escribe una consulta que devuelva título y socio de los préstamos todavía no devueltos.

Resultado esperado: 3 filas con titulo, socio. El orden de las filas no importa.

Ver tablas y datos

Cargando la estructura del ejercicio…

La consulta usa datos ficticios y se ejecuta solo en este navegador.

Etapas autónomas

Etapa 3 · Resumen por autor

Obtén una fila por autor con cantidad de libros, préstamos totales y préstamos abiertos. Conserva también autores cuyos libros no tengan préstamos.

Ver una orientación

Parte de autores, usa dos LEFT JOIN y cuenta DISTINCT l.id. Para los abiertos, suma un CASE que valga 1 cuando la fecha de devolución sea nula y exista préstamo.

Ver la solución explicada
Solución SQL
SELECT a.nombre AS autor,
       COUNT(DISTINCT l.id) AS libros,
       COUNT(p.id) AS prestamos,
       SUM(CASE
             WHEN p.id IS NOT NULL
              AND p.fecha_devolucion IS NULL THEN 1
             ELSE 0
           END) AS abiertos
FROM autores AS a
LEFT JOIN libros AS l ON l.autor_id = a.id
LEFT JOIN prestamos AS p ON p.libro_id = l.id
GROUP BY a.id, a.nombre
ORDER BY a.nombre;

COUNT(p.id) produce cero si no existe préstamo. El CASE evita contar como abierto el NULL artificial de un LEFT JOIN.

Resumen por autor
autorlibrosprestamosabiertos
Gabriel García Márquez210
Isabel Allende111
Julio Cortázar110
Rosa Montero111
Ursula K. Le Guin211

Etapa 4 · Libros nunca prestados

Localiza títulos sin ninguna fila en prestamos.

Ver la solución
Solución SQL
SELECT l.titulo, a.nombre AS autor
FROM libros AS l
JOIN autores AS a ON a.id = l.autor_id
LEFT JOIN prestamos AS p ON p.libro_id = l.id
WHERE p.id IS NULL
ORDER BY l.titulo;

Devuelve El amor en los tiempos del cólera y La mano izquierda de la oscuridad.

Etapa 5 · Reflexión

  • ¿Qué consulta usarías para detectar un préstamo abierto cuyo libro figura como disponible?
  • ¿Qué restricción o proceso evitaría esa incoherencia?
  • ¿Qué índice medirías si la tabla de préstamos creciera mucho?

Comprueba si puedes explicarlo

Un libro tiene dos préstamos históricos. ¿Por qué COUNT(l.id) puede exagerar la cantidad de libros por autor?

Ver respuesta razonada

El JOIN repite el libro una vez por préstamo. COUNT(DISTINCT l.id) cuenta cada libro una vez; COUNT(p.id) cuenta los préstamos. Son unidades distintas.

Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.

Qué debes recordar

  • Divide el problema y comprueba cada etapa.
  • Define siempre qué representa una fila.
  • Usa recuentos y casos pequeños para detectar duplicados o ausencias.

A continuación: completa la evaluación final.

Fuentes técnicas consultadas

El proyecto utiliza un subconjunto portable. Las herramientas de inspección, restricciones y planes de ejecución cambian según el motor.

Conceptos relacionados