IOKELU
Nivel: Intermedio
💡 Ejecuta el proyecto:
Puedes probar cada consulta del proyecto en nuestra consola interactiva: Abrir consola SQL →

Proyecto SQL Intermedio Nº1: Sistema de análisis de ventas

En este proyecto aplicarás todo lo aprendido: JOINS, funciones avanzadas, subconsultas, índices, vistas y filtros. Construiremos un pequeño sistema de análisis de ventas con consultas reales y reutilizables.

Tabla de contenidos

  • Definición del proyecto
  • Creación de tablas
  • Inserción de datos
  • Consultas básicas
  • Consultas avanzadas
  • Creación de vistas
  • Creación de índices
  • Reporte final
  • Ejercicios
  • Errores comunes

1. Definición del proyecto

Construiremos un sistema de ventas con tres tablas:

2. Crear tablas


CREATE TABLE productos (
    id INT PRIMARY KEY,
    nombre VARCHAR(50),
    precio DECIMAL(10,2)
);

CREATE TABLE clientes (
    id INT PRIMARY KEY,
    nombre VARCHAR(50),
    ciudad VARCHAR(50)
);

CREATE TABLE ventas (
    id INT PRIMARY KEY,
    cliente_id INT,
    producto_id INT,
    fecha DATE,
    cantidad INT,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    FOREIGN KEY (producto_id) REFERENCES productos(id)
);
    

3. Insertar datos


INSERT INTO productos VALUES
(1, 'Teclado', 25.99),
(2, 'Ratón', 15.50),
(3, 'Monitor', 120.00);

INSERT INTO clientes VALUES
(1, 'Ana', 'Madrid'),
(2, 'Luis', 'Barcelona'),
(3, 'Marta', 'Valencia');

INSERT INTO ventas VALUES
(1, 1, 1, '2024-01-10', 2),
(2, 1, 3, '2024-01-12', 1),
(3, 2, 2, '2024-01-15', 3),
(4, 3, 1, '2024-01-20', 1);
    

4. Consultas básicas


SELECT * FROM productos;
SELECT * FROM clientes;
SELECT * FROM ventas;
    

5. Consultas avanzadas


-- Ventas con detalle de cliente y producto
SELECT c.nombre AS cliente, p.nombre AS producto, v.cantidad, v.fecha
FROM ventas v
JOIN clientes c ON v.cliente_id = c.id
JOIN productos p ON v.producto_id = p.id;

-- Total gastado por cada cliente
SELECT c.nombre, SUM(p.precio * v.cantidad) AS total_gastado
FROM ventas v
JOIN clientes c ON v.cliente_id = c.id
JOIN productos p ON v.producto_id = p.id
GROUP BY c.nombre;

-- Producto más vendido
SELECT p.nombre, SUM(v.cantidad) AS total
FROM ventas v
JOIN productos p ON v.producto_id = p.id
GROUP BY p.nombre
ORDER BY total DESC
LIMIT 1;
    

6. Crear vistas


CREATE VIEW vista_ventas_detalle AS
SELECT c.nombre AS cliente, p.nombre AS producto, v.cantidad, v.fecha
FROM ventas v
JOIN clientes c ON v.cliente_id = c.id
JOIN productos p ON v.producto_id = p.id;
    

7. Crear índices


CREATE INDEX idx_ventas_cliente
ON ventas(cliente_id);

CREATE INDEX idx_ventas_producto
ON ventas(producto_id);
    

8. Reporte final


SELECT c.nombre AS cliente,
       COUNT(*) AS compras,
       SUM(p.precio * v.cantidad) AS total_gastado
FROM ventas v
JOIN clientes c ON v.cliente_id = c.id
JOIN productos p ON v.producto_id = p.id
GROUP BY c.nombre
ORDER BY total_gastado DESC;
    

9. Ejercicios

  1. Crea una vista con el total gastado por cliente.
  2. Crea un índice para acelerar búsquedas por fecha.
  3. Muestra el producto menos vendido.
  4. Muestra el cliente con más compras.
  5. Explica por qué los índices mejoran el rendimiento.

10. Errores comunes


Siguiente guía

SQL Intermedio – Proyecto 2 →