Antes de empezar

  1. Carga el dataset base: recursos/dataset.sql.
  2. Resuelve por niveles: Básico → Intermedio → Reto.
  3. Abre la solución, compara y revisa la explicación.

Tablas: productos(id, nombre, precio, stock, categoria) y clientes(id, nombre, ciudad).

Nivel 1 – Básico (1–8)

Estructura de consulta, columnas, filtros simples y orden básico.

1) Listado de productos (catálogo)

Enunciado: Muestra nombre, precio y categoria de todos los productos.

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

Explicación: seleccionas columnas específicas para un catálogo más claro (evitas *).

2) Listado de clientes

Enunciado: Muestra el nombre y la ciudad de todos los clientes.

Ver solución
SELECT nombre, ciudad
FROM clientes;

Explicación: consulta básica sobre otra tabla.

3) Productos disponibles

Enunciado: Lista productos con stock > 0 mostrando nombre y stock.

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

Explicación: WHERE filtra solo filas con existencia.

4) Productos sin stock

Enunciado: Lista productos con stock = 0.

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

Explicación: útil para detectar faltantes.

5) Filtrar por categoría

Enunciado: Lista productos de la categoría 'Papelería' (nombre y precio).

Ver solución
SELECT nombre, precio
FROM productos
WHERE categoria = 'Papelería';

Explicación: el texto va entre comillas.

6) Filtrar por ciudad

Enunciado: Lista clientes de 'Quito'.

Ver solución
SELECT nombre, ciudad
FROM clientes
WHERE ciudad = 'Quito';

Explicación: filtro simple por texto.

7) Ordenar productos por precio (menor→mayor)

Enunciado: Lista nombre y precio ordenados por precio ascendente.

Ver solución
SELECT nombre, precio
FROM productos
ORDER BY precio ASC;

Explicación: ASC ordena de menor a mayor (a veces es el valor por defecto).

8) Ordenar clientes por ciudad y nombre

Enunciado: Lista clientes ordenados por ciudad (A→Z) y luego por nombre (A→Z).

Ver solución
SELECT nombre, ciudad
FROM clientes
ORDER BY ciudad ASC, nombre ASC;

Explicación: orden múltiple: el segundo criterio se aplica dentro del primero.

Nivel 2 – Intermedio (9–16)

LIKE, IN, BETWEEN, AND/OR con paréntesis, combinaciones y orden.

9) Buscar productos que contengan “Cuaderno”

Enunciado: Lista productos cuyo nombre contenga Cuaderno.

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

Explicación: % permite texto antes/después, “contiene”.

10) Buscar productos que empiecen con “C”

Enunciado: Lista productos cuyo nombre empiece con la letra C.

Ver solución
SELECT nombre
FROM productos
WHERE nombre LIKE 'C%';

Explicación: 'C%' = “empieza con C”.

11) Filtrar por lista de ciudades (IN)

Enunciado: Lista clientes de Quito, Guayaquil o Cuenca (una sola consulta).

Ver solución
SELECT nombre, ciudad
FROM clientes
WHERE ciudad IN ('Quito', 'Guayaquil', 'Cuenca');

Explicación: IN reemplaza varios OR y hace la consulta más legible.

12) Productos por rango de precio (BETWEEN)

Enunciado: Lista productos con precio entre 1 y 10 (incluyendo extremos).

Ver solución
SELECT nombre, precio
FROM productos
WHERE precio BETWEEN 1 AND 10
ORDER BY precio ASC;

Explicación: BETWEEN filtra por rango, ORDER BY los presenta ordenados.

13) AND: Papelería barata

Enunciado: Lista productos de Papelería con precio < 2 (nombre, precio, stock).

Ver solución
SELECT nombre, precio, stock
FROM productos
WHERE categoria = 'Papelería'
  AND precio < 2;

Explicación: AND exige ambas condiciones.

14) OR: Productos de Accesorio o Electrónica

Enunciado: Lista productos que sean Accesorio o Electrónica (usa IN o OR).

Ver solución (IN)
SELECT nombre, categoria
FROM productos
WHERE categoria IN ('Accesorio', 'Electrónica');

Explicación: IN es una forma más limpia de expresar alternativas.

15) Mezcla AND/OR con paréntesis

Enunciado: Lista productos de Papelería que cumplan: (precio < 1 OR stock >= 100).

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 prioridad lógica.

16) Integración: filtro + orden

Enunciado: Lista productos con stock > 0 y categoría Papelería o Accesorio, ordenados por categoría (A→Z) y luego por stock (mayor→menor).

Ver solución
SELECT nombre, categoria, stock
FROM productos
WHERE stock > 0
  AND (categoria = 'Papelería' OR categoria = 'Accesorio')
ORDER BY categoria ASC, stock DESC;

Explicación: se filtra stock primero y se agrupan categorías con paréntesis.

Nivel 3 – Reto (17–20)

Agregaciones (COUNT/SUM/AVG) y retos tipo negocio.

17) Resumen del inventario total

Enunciado: Obtén: cantidad de productos, stock total y precio promedio (sin filtros).

Ver solución
SELECT
  COUNT(*) AS total_productos,
  SUM(stock) AS stock_total,
  AVG(precio) AS precio_promedio
FROM productos;

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

18) Resumen de Papelería (agregación + WHERE)

Enunciado: Obtén cantidad de productos, stock total y precio promedio solo para Papelería.

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

Explicación: WHERE filtra primero, luego se calcula el resumen del subconjunto.

19) Conteo de productos “con stock” vs “sin stock” (2 consultas)

Enunciado: Escribe 2 consultas: (a) cuántos productos tienen stock > 0 y (b) cuántos tienen stock = 0.

Ver solución
-- (a) con stock
SELECT COUNT(*) AS con_stock
FROM productos
WHERE stock > 0;

-- (b) sin stock
SELECT COUNT(*) AS sin_stock
FROM productos
WHERE stock = 0;

Explicación: dos resúmenes diferentes con filtros distintos.

20) (Opcional con dataset extendido) Resumen de ventas

Enunciado: Si cargaste ventas, obtén: cantidad de ventas, total vendido y promedio por venta.

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 de ventas.