📝 SQL — EJERCICIOS

// Dos bases de datos resueltas paso a paso

BASES DE DATOS // 2026-02-12 — Iván Brihuega

Ejercicios resueltos sobre dos bases de datos típicas de examen: una tienda con productos y fabricantes, y una empresa con empleados y departamentos.

⬡ BD TIENDA — ESTRUCTURA
TablaColumnas
fabricanteid, nombre
productoid, nombre, precio, id_fabricante
producto.id_fabricante → fabricante.id
⬡ BD TIENDA — EJERCICIOS RESUELTOS
// 01 — Lista nombres de productos
SELECT nombre FROM producto;
// 02 — Productos con precio menor de 200
SELECT * FROM producto WHERE precio < 200;
// 03 — Los 3 productos más caros
SELECT nombre, precio FROM producto ORDER BY precio DESC LIMIT 3;
// 04 — Nombres de fabricantes en mayúsculas
SELECT UPPER(nombre) FROM fabricante;
// 05 — Precio medio por fabricante, solo si media mayor de 150
SELECT id_fabricante, AVG(precio) AS media FROM producto GROUP BY id_fabricante HAVING AVG(precio) > 150;
// 06 — Total precios de productos que contienen 'Disco'
SELECT SUM(precio) AS total FROM producto WHERE nombre LIKE '%Disco%';
⬡ BD RRHH — ESTRUCTURA
TablaColumnas
departamentoid, nombre
empleadoid, nombre, salario, id_departamento, fecha_ingreso
empleado.id_departamento → departamento.id
⬡ BD RRHH — EJERCICIOS RESUELTOS
// 01 — Lista nombres de empleados
SELECT nombre FROM empleado;
// 02 — Empleados con salario menor de 3000
SELECT * FROM empleado WHERE salario < 3000;
// 03 — Los 3 empleados con mejor salario
SELECT nombre, salario FROM empleado ORDER BY salario DESC LIMIT 3;
// 04 — Nombres de departamentos en mayúsculas
SELECT UPPER(nombre) FROM departamento;
// 05 — Nº de empleados por departamento (incluye los que no tienen ninguno)
SELECT d.nombre, COUNT(e.id) AS total_empleados FROM departamento d LEFT JOIN empleado e ON d.id = e.id_departamento GROUP BY d.id, d.nombre;
// 06 — Salario medio por departamento, solo si media mayor de 3000
SELECT id_departamento, AVG(salario) AS media FROM empleado GROUP BY id_departamento HAVING AVG(salario) > 3000;
// 07 — Total salarios de empleados con apellido García
SELECT SUM(salario) AS total FROM empleado WHERE nombre LIKE '%García%';
// 08 — Departamentos con más de 1 empleado
SELECT id_departamento, COUNT(*) AS total FROM empleado GROUP BY id_departamento HAVING COUNT(*) > 1;
// 09 — Media y máximo de salarios
SELECT AVG(salario) AS media, MAX(salario) AS maximo FROM empleado;
// 10 — Empleados en Informática o Ventas con salario mayor de 3000
SELECT e.nombre, e.salario, d.nombre AS departamento FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id WHERE d.nombre IN ('Informática','Ventas') AND e.salario > 3000;
// 11 — Contratados antes de 2025-01-01 con salario menor de 3500
SELECT * FROM empleado WHERE fecha_ingreso < '2025-01-01' AND salario < 3500;
// 12 — Días desde contratación para empleados en Marketing o RRHH
SELECT e.nombre, DATEDIFF(CURDATE(), e.fecha_ingreso) AS dias FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id WHERE d.nombre IN ('Marketing','Recursos Humanos');
// 13 — Nombre termina en 'a' y contratados después de marzo 2025
SELECT * FROM empleado WHERE nombre LIKE '%a' AND fecha_ingreso > '2025-03-31';
// 14 — Salario medio de contratados en 2025 en Informática
SELECT AVG(e.salario) AS media FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id WHERE d.nombre = 'Informática' AND YEAR(e.fecha_ingreso) = 2025;
// 15 — Empleados con salario mayor que la media del departamento de Informática
SELECT nombre, salario FROM empleado WHERE salario > ( SELECT AVG(e2.salario) FROM empleado e2 INNER JOIN departamento d ON e2.id_departamento = d.id WHERE d.nombre = 'Informática' );
⬅ Volver a Artículos