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:
- productos
- clientes
- ventas
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
- Crea una vista con el total gastado por cliente.
- Crea un índice para acelerar búsquedas por fecha.
- Muestra el producto menos vendido.
- Muestra el cliente con más compras.
- Explica por qué los índices mejoran el rendimiento.
10. Errores comunes
- No usar JOIN correctamente.
- Crear índices innecesarios.
- Olvidar agrupar columnas en funciones de agregación.
- Confundir vistas con tablas reales.