Escenario

La papelería “El Buen Escritor” quiere analizar su información básica: productos, clientes y un registro simple de ventas. Tu trabajo como estudiante es escribir consultas para responder preguntas del negocio.

Tablas disponibles

  • productos(id, nombre, precio, stock, categoria)
  • clientes(id, nombre, ciudad)
  • Opcional (si instalas el dataset extendido): ventas(id, fecha, cliente_id, total) y detalle_venta(venta_id, producto_id, cantidad, precio_unit)

Recomendación: usa primero el dataset base y luego el extendido para practicar con fechas y “totales”.

Cómo trabajar el mini-proyecto

  1. Carga el dataset base (recursos/dataset.sql).
  2. Resuelve los Retos 1–9 (solo con productos y clientes).
  3. Si quieres nivel extra, carga el dataset extendido y resuelve Retos 10–12.
  4. Compara con las soluciones y revisa “errores comunes”.

Retos del mini-proyecto

Intenta resolver antes de abrir la solución.

Reto 1: Catálogo básico

Muestra el nombre, precio y stock de todos los productos.

Ver solución
SELECT nombre, precio, stock
FROM productos;

Explicación: consulta básica para explorar el catálogo.

Reto 2: Productos disponibles

Lista solo productos con stock mayor a 0.

Ver solución
SELECT nombre, stock
FROM productos
WHERE stock > 0;

Explicación: WHERE filtra filas que cumplan la condición.

Reto 3: Productos sin stock

Lista productos con stock igual a 0.

Ver solución
SELECT nombre, stock
FROM productos
WHERE stock = 0;

Explicación: útil para identificar quiebres de inventario.

Reto 4: Categorías específicas

Lista productos que sean de Papelería o Accesorio (usa IN).

Ver solución
SELECT nombre, categoria
FROM productos
WHERE categoria IN ('Papelería', 'Accesorio');

Explicación: IN reemplaza varios OR.

Reto 5: Búsqueda por nombre

Lista productos cuyo nombre contenga “Cuaderno” (usa LIKE).

Ver solución
SELECT nombre, precio
FROM productos
WHERE nombre LIKE '%Cuaderno%';

Explicación: % permite texto antes y después.

Reto 6: Rango de precios

Lista productos con precio entre 1 y 5 (usa BETWEEN).

Ver solución
SELECT nombre, precio
FROM productos
WHERE precio BETWEEN 1 AND 5;

Explicación: BETWEEN filtra rangos numéricos.

Reto 7: Ordenar por importancia

Lista productos disponibles (stock > 0) ordenados por stock (mayor→menor).

Ver solución
SELECT nombre, stock
FROM productos
WHERE stock > 0
ORDER BY stock DESC;

Explicación: filtras primero y ordenas al final.

Reto 8: Condiciones combinadas

Lista productos de Papelería que tengan (precio < 1 o stock > 100). Usa paréntesis.

Ver solución
SELECT nombre, categoria, precio, stock
FROM productos
WHERE categoria = 'Papelería'
  AND (precio < 1 OR stock > 100);

Explicación: los paréntesis controlan la lógica AND/OR.

Reto 9: Resumen de inventario

Obtén en una sola consulta: cantidad de productos, stock total y precio promedio para la categoría Papelería.

Ver solución
SELECT
  COUNT(*) AS total_productos,
  SUM(stock) AS stock_total,
  AVG(precio) AS precio_promedio
FROM productos
WHERE categoria = 'Papelería';

Explicación: agregación + filtro para resumen por categoría.


Retos 10–12 (Nivel extra con dataset extendido)

Para estos retos, instala el archivo recursos/dataset-extendido.sql (lo tienes abajo en esta lección).

Reto 10: Ventas de un día

Lista las ventas del día '2025-12-01' (id, fecha, cliente_id, total).

Ver solución
SELECT id, fecha, cliente_id, total
FROM ventas
WHERE fecha = '2025-12-01';

Explicación: filtro por fecha con formato YYYY-MM-DD.

Reto 11: Ventas en un rango de fechas

Lista ventas entre '2025-12-01' y '2025-12-05' (incluyendo extremos).

Ver solución
SELECT id, fecha, cliente_id, total
FROM ventas
WHERE fecha BETWEEN '2025-12-01' AND '2025-12-05'
ORDER BY fecha ASC;

Explicación: BETWEEN para rango + ORDER BY para ver cronológicamente.

Reto 12: Resumen de ventas

Obtén: cantidad de ventas, total vendido y promedio por venta para todas las ventas registradas.

Ver solución
SELECT
  COUNT(*) AS cantidad_ventas,
  SUM(total) AS total_vendido,
  AVG(total) AS promedio_por_venta
FROM ventas;

Explicación: agregación global sobre la tabla ventas.

Errores comunes

  • ❌ Mezclar AND/OR sin paréntesis — ✅ usa paréntesis.
  • ❌ Olvidar comillas en texto — ✅ 'Quito', 'Papelería'.
  • ❌ Suponer orden sin ORDER BY — ✅ si importa el orden, ordénalo.
  • ❌ Creer que BETWEEN excluye extremos — ✅ normalmente incluye extremos.

Dataset extendido (opcional) – Ventas

Copia esto en un archivo: recursos/dataset-extendido.sql y ejecútalo. (No afecta a tus tablas base).

/* ===============================
   DATASET EXTENDIDO APRENDESQL
   (ventas + detalle_venta)
   =============================== */

CREATE TABLE ventas (
  id INT PRIMARY KEY,
  fecha DATE,
  cliente_id INT,
  total DECIMAL(10,2)
);

CREATE TABLE detalle_venta (
  venta_id INT,
  producto_id INT,
  cantidad INT,
  precio_unit DECIMAL(10,2)
);

/* Ventas (fechas reales para practicar BETWEEN) */
INSERT INTO ventas (id, fecha, cliente_id, total) VALUES
(1, '2025-12-01', 1, 6.20),
(2, '2025-12-01', 2, 18.00),
(3, '2025-12-02', 4, 3.70),
(4, '2025-12-03', 3, 10.49),
(5, '2025-12-05', 7, 2.50);

/* Detalle simple (sin JOIN en este módulo; queda listo para el siguiente) */
INSERT INTO detalle_venta (venta_id, producto_id, cantidad, precio_unit) VALUES
(1, 1, 2, 2.50),
(1, 2, 3, 0.35),

(2, 4, 1, 18.00),

(3, 3, 2, 0.50),
(3, 5, 1, 1.20),

(4, 6, 1, 9.99),
(4, 8, 1, 1.80),

(5, 1, 1, 2.50);

Con estas tablas, en el siguiente módulo podrás aprender JOIN y ver ventas con nombres de clientes y productos.