Saltar al contenido
Bases de datos con SQL
Todos los cursos

Ejercicio: Proyecto: base de datos de una tienda

  • ⏱ 90 minutos
  • 📶 Nivel: principiante

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):

Ticket promedio
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
Clientes que gastan más de 300
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

nombregasto
Luis Pérez929.00
Marta Ruiz334.50
Ana Torres315.50

Para los errores del paso 5, con claves foráneas activas:

Cliente inexistente y cantidad 0
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
Ejemplo de seguridad.md
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.