🔹 Introducción
¡Felicitaciones por llegar hasta aquí! 🎉
A lo largo del curso ya aprendiste:
- Crear y modificar tablas.
- Insertar, actualizar y eliminar registros.
- Seleccionar, filtrar y ordenar información.
- Usar funciones de agregación (
COUNT,SUM,AVG,MIN,MAX). - Agrupar datos con
GROUP BYyHAVING. - Combinar tablas con
JOIN. - Usar subconsultas y vistas.
- Aplicar transacciones y funciones avanzadas.
Ahora vas a resolver un conjunto de consultas integradoras usando la base de datos de la biblioteca.
👉 Recuerda:
- Puedes usar DB-Fiddle.com con MySQL 8.0.
- Si usas transacciones, selecciona PostgreSQL 15 porque DB-Fiddle no soporta transacciones en MySQL.
🔹 Base de datos de referencia
Copia este esquema en DB-Fiddle antes de comenzar:
-- Tabla de autores
CREATE TABLE autores (
id INT PRIMARY KEY,
nombre VARCHAR(100),
nacionalidad VARCHAR(50)
);
-- Tabla de libros
CREATE TABLE libros (
id INT PRIMARY KEY,
titulo VARCHAR(150),
id_autor INT,
anio_publicacion INT,
disponible BOOLEAN,
FOREIGN KEY (id_autor) REFERENCES autores(id)
);
-- Tabla de préstamos
CREATE TABLE prestamos (
id INT PRIMARY KEY,
id_libro INT,
nombre_usuario VARCHAR(100),
fecha_prestamo DATE,
fecha_devolucion DATE,
FOREIGN KEY (id_libro) REFERENCES libros(id)
);
-- Datos de prueba
INSERT INTO autores (id, nombre, nacionalidad) VALUES
(1, 'Gabriel García Márquez', 'Colombiana'),
(2, 'Miguel de Cervantes', 'Española'),
(3, 'Jane Austen', 'Británica');
INSERT INTO libros (id, titulo, id_autor, anio_publicacion, disponible) VALUES
(1, 'Cien años de soledad', 1, 1967, TRUE),
(2, 'El Quijote', 2, 1605, FALSE),
(3, 'Orgullo y prejuicio', 3, 1813, TRUE);
INSERT INTO prestamos (id, id_libro, nombre_usuario, fecha_prestamo, fecha_devolucion) VALUES
(1, 2, 'Laura', '2025-08-01', NULL),
(2, 1, 'Pedro', '2025-07-15', '2025-07-30');
🔹 Ejercicio práctico (Examen Final)
Responde cada pregunta con una consulta SQL.
1. Listar todos los libros con el nombre de su autor.
👉 Tip: usá un JOIN.
2. Mostrar los préstamos que aún no han sido devueltos.
👉 Tip: la condición está en fecha_devolucion.
3. Calcular la cantidad de libros por nacionalidad de autor.
👉 Tip: GROUP BY sobre nacionalidad.
4. Obtener el año de publicación más antiguo y el más reciente.
👉 Tip: usá MIN y MAX.
5. Mostrar el nombre de los usuarios y cuántos libros prestaron.
👉 Tip: COUNT + GROUP BY.
6. Insertar un nuevo préstamo del libro “Orgullo y prejuicio” para el usuario “Carlos” en la fecha de hoy.
👉 Tip: INSERT INTO prestamos (...).
7. Crear una vista llamada vista_libros_disponibles que muestre solo los títulos de libros disponibles.
8. Hacer una subconsulta que devuelva el título del libro más reciente.
👉 Tip: compara contra MAX(anio_publicacion).
9. Actualizar el libro “El Quijote” para que vuelva a estar disponible.
👉 Tip: UPDATE ... WHERE titulo = 'El Quijote'.
10. (Opcional Avanzado) Simular una transacción donde Ana presta su libro a Juan:
- Ana entrega su libro y deja de estar disponible.
- Se inserta un registro en préstamos con Juan como usuario.
👉 ⚠️ Para este ejercicio usa PostgreSQL 15 en DB-Fiddle.
🔹 Soluciones sugeridas
-- 1. Libros con autor
SELECT l.titulo, a.nombre AS autor
FROM libros l
INNER JOIN autores a ON l.id_autor = a.id;
-- 2. Préstamos activos
SELECT l.titulo, p.nombre_usuario, p.fecha_prestamo
FROM prestamos p
INNER JOIN libros l ON p.id_libro = l.id
WHERE p.fecha_devolucion IS NULL;
-- 3. Libros por nacionalidad
SELECT a.nacionalidad, COUNT(l.id) AS total_libros
FROM autores a
LEFT JOIN libros l ON a.id = l.id_autor
GROUP BY a.nacionalidad;
-- 4. Año más antiguo y más reciente
SELECT MIN(anio_publicacion) AS mas_antiguo,
MAX(anio_publicacion) AS mas_reciente
FROM libros;
-- 5. Usuarios y cantidad de préstamos
SELECT nombre_usuario, COUNT(*) AS cantidad
FROM prestamos
GROUP BY nombre_usuario;
-- 6. Nuevo préstamo de Carlos
INSERT INTO prestamos (id, id_libro, nombre_usuario, fecha_prestamo, fecha_devolucion)
VALUES (3, 3, 'Carlos', NOW(), NULL);
-- 7. Vista de libros disponibles
CREATE VIEW vista_libros_disponibles AS
SELECT titulo FROM libros WHERE disponible = TRUE;
-- 8. Libro más reciente con subconsulta
SELECT titulo
FROM libros
WHERE anio_publicacion = (SELECT MAX(anio_publicacion) FROM libros);
-- 9. El Quijote disponible
UPDATE libros
SET disponible = TRUE
WHERE titulo = 'El Quijote';
-- 10. Transacción (PostgreSQL)
BEGIN;
UPDATE libros SET disponible = FALSE WHERE titulo = 'Cien años de soledad';
INSERT INTO prestamos (id, id_libro, nombre_usuario, fecha_prestamo, fecha_devolucion)
VALUES (4, 1, 'Juan', NOW(), NULL);
COMMIT;
🔹 Cierre del curso
🎉 ¡Felicitaciones! Has completado el Curso Gratis de SQL — de Cero a Avanzado.
Ahora ya sabes:
✔ Cómo crear, consultar y modificar bases de datos.
✔ Cómo usar filtros, agregaciones y combinaciones de tablas.
✔ Cómo aplicar funciones avanzadas y transacciones.
✔ Cómo trabajar con proyectos reales.
👉 El siguiente paso: practicar con diferentes motores (PostgreSQL, MySQL, SQL Server) para entender las pequeñas diferencias entre ellos y volverte más versátil.
🎯 Avanza con el siguiente tema o repasa los anteriores desde el Curso SQL completo.