Ejercicio: Proyecto: base de datos de una tienda
Objetivo
Construir tu propia versión de la base de datos de la tienda, ampliarla con tus datos e informes y dejarla documentada y protegida.
Cómo se trabaja
Trabaja en una carpeta tienda/ con tu archivo tienda.sql y una base tienda.db. Parte del script de la lección y haz crecer el proyecto. Marca cada entrega a medida que la completes.
Pasos
Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.
💡 Pista 1: orden de carga
Primero productos y clientes; después pedidos; al final lineas_pedido, que depende de las otras.
💡 Pista 2: los informes propios
El ticket promedio es el promedio de los totales por pedido: agrupa por pedido en una subconsulta y calcula AVG fuera.
✅ Ver una solución posible
Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.
Cada persona tendrá datos distintos, pero estos son dos informes extra con el script original (resultados verificados):
SELECT AVG(total) AS promedio
FROM (
SELECT p.id, SUM(l.cantidad * pr.precio) AS total
FROM pedidos p
JOIN lineas_pedido l ON l.pedido_id = p.id
JOIN productos pr ON pr.id = l.producto_id
GROUP BY p.id
);
Resultado esperado
| promedio |
|---|
| 394.75 |
SELECT c.nombre, SUM(l.cantidad * pr.precio) AS gasto
FROM clientes c
JOIN pedidos p ON p.cliente_id = c.id
JOIN lineas_pedido l ON l.pedido_id = p.id
JOIN productos pr ON pr.id = l.producto_id
GROUP BY c.id
HAVING SUM(l.cantidad * pr.precio) > 300
ORDER BY gasto DESC;
Resultado esperado
| nombre | gasto |
|---|---|
| Luis Pérez | 929.00 |
| Marta Ruiz | 334.50 |
| Ana Torres | 315.50 |
Para los errores del paso 5, con claves foráneas activas:
INSERT INTO pedidos (cliente_id, fecha) VALUES (99, '2026-10-06');
INSERT INTO lineas_pedido (pedido_id, producto_id, cantidad) VALUES (1, 3, 0);
Error: FOREIGN KEY constraint failed Error: CHECK constraint failed: cantidad > 0
Rol de la aplicación: tienda_app
GRANT SELECT ON productos, clientes TO tienda_app;
GRANT SELECT, INSERT ON pedidos, lineas_pedido TO tienda_app;
GRANT UPDATE (stock) ON productos TO tienda_app;
Copia diaria: sqlite3 tienda.db ".backup 'copia.db'"
💡 🏁 Reto extra (opcional)
Guarda el precio vendido en lineas_pedido (columna precio_unitario) y recalcula los informes con ese precio. Después añade una tabla categorias y relaciona productos con ella.