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
- Explora columnas y relaciones.
- Obtén una lista básica y valida nombres.
- Filtra préstamos abiertos.
- Resume actividad por autor.
- Detecta libros sin préstamos.
- 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.
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;| titulo | autor |
|---|---|
| Cien años de soledad | Gabriel García Márquez |
| El amor en los tiempos del cólera | Gabriel García Márquez |
| La mano izquierda de la oscuridad | Ursula K. Le Guin |
| Rayuela | Julio Cortázar |
Comprobaciones
- La clave es
libros.autor_id = autores.id. - Hay cuatro libros con
disponible = 1. - Gabriel García Márquez aparece dos veces porque tiene dos libros disponibles.
Un error habitual
Agrupar antes de definir la unidad
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
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…
Parte de prestamos.
Relaciona libro_id con libros.id.
Filtra fecha_devolucion IS NULL.
Solución
SELECT l.titulo, p.socio FROM prestamos AS p JOIN libros AS l ON p.libro_id = l.id WHERE p.fecha_devolucion IS NULL;La consulta separa la relación entre tablas del estado del préstamo.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
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
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.
| autor | libros | prestamos | abiertos |
|---|---|---|---|
| Gabriel García Márquez | 2 | 1 | 0 |
| Isabel Allende | 1 | 1 | 1 |
| Julio Cortázar | 1 | 1 | 0 |
| Rosa Montero | 1 | 1 | 1 |
| Ursula K. Le Guin | 2 | 1 | 1 |
Etapa 4 · Libros nunca prestados
Localiza títulos sin ninguna fila en prestamos.
Ver la solución
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.