sábado, 7 de marzo de 2026

10 Ejercicios de SQL Resueltos: JOINs, Subconsultas y Agrupaciones (Nivel Universidad)

Las consultas SQL son el pan de cada día de cualquier Ingeniero de Software. Si estás cursando Bases de Datos, sabrás que el profesor no se conforma con un simple SELECT * FROM. Quieren ver si dominas los JOINs, las subconsultas y las funciones de agregación.

En larebelion.com hemos recopilado 10 ejercicios clásicos de exámenes de universidades como la UPM, UPC y UGR para que practiques y arrases en tu evaluación. Todas las soluciones están preparadas para motores estándar como PostgreSQL o MySQL.





1. Agrupación Básica: Total de Alumnos por Grado (UPM)

Enunciado: Dada la tabla alumnos con los campos id, nombre y id_grado, obtén el número total de alumnos matriculados en cada grado.

SELECT id_grado, COUNT(id) AS total_alumnos
FROM alumnos
GROUP BY id_grado;

2. INNER JOIN: Nombres de Alumnos y sus Grados (UGR)

Enunciado: Muestra el nombre del alumno y el nombre del grado que cursa. Tienes las tablas alumnos y grados.

SELECT a.nombre, g.nombre_grado
FROM alumnos a
INNER JOIN grados g ON a.id_grado = g.id;

3. GROUP BY con HAVING: Departamentos Grandes (UPC)

Enunciado: Obtén el nombre de los departamentos que tienen estrictamente más de 5 empleados trabajando en ellos.

SELECT d.nombre_depto, COUNT(e.id) AS num_empleados
FROM departamentos d
INNER JOIN empleados e ON d.id = e.id_depto
GROUP BY d.id, d.nombre_depto
HAVING COUNT(e.id) > 5;

4. LEFT JOIN: Profesores Sin Proyectos (UV)

Enunciado: Lista todos los profesores registrados. Si están dirigiendo un proyecto, muestra el nombre del proyecto; si no, muestra un valor nulo, pero el profesor debe aparecer.

SELECT p.nombre, pr.titulo_proyecto
FROM profesores p
LEFT JOIN proyectos pr ON p.id = pr.id_profesor;

5. Subconsulta en el WHERE: Salarios Superiores a la Media (UC3M)

Enunciado: Muestra los nombres de los empleados que tienen un salario superior al salario medio de toda la empresa.

SELECT nombre, salario
FROM empleados
WHERE salario > (
    SELECT AVG(salario)
    FROM empleados
);

6. Múltiples JOINs: Facturación Total de un Cliente (US)

Enunciado: Calcula cuánto dinero ha gastado en total el cliente con ID = 1001 cruzando las tablas clientes, pedidos y lineas_pedido.

SELECT c.nombre, SUM(lp.cantidad * lp.precio_unitario) AS total_gastado
FROM clientes c
INNER JOIN pedidos p ON c.id = p.id_cliente
INNER JOIN lineas_pedido lp ON p.id = lp.id_pedido
WHERE c.id = 1001
GROUP BY c.id, c.nombre;

7. NOT IN: Clientes Sin Pedidos en el Último Mes (UAM)

Enunciado: Encuentra el nombre y correo de los clientes que no han realizado ningún pedido en enero de 2024.

SELECT nombre, email
FROM clientes
WHERE id NOT IN (
    SELECT id_cliente
    FROM pedidos
    WHERE fecha_pedido >= '2024-01-01' AND fecha_pedido <= '2024-01-31'
);

8. Subconsulta Correlacionada: Empleados Mejor Pagados (UA)

Enunciado: Obtén el nombre de los empleados cuyo salario sea el máximo de su propio departamento.

SELECT e1.nombre, e1.salario, e1.id_depto
FROM empleados e1
WHERE e1.salario = (
    SELECT MAX(e2.salario)
    FROM empleados e2
    WHERE e1.id_depto = e2.id_depto
);

9. COUNT DISTINCT: Asignaturas Impartidas (URJC)

Enunciado: Calcula cuántas asignaturas *diferentes* ha impartido el profesor "Martínez" a lo largo de los años.

SELECT COUNT(DISTINCT id_asignatura) AS asignaturas_unicas
FROM docencia d
INNER JOIN profesores p ON d.id_profesor = p.id
WHERE p.apellidos = 'Martínez';

10. Actualización con Subconsulta (UMA)

Enunciado: Escribe una consulta UPDATE para aumentar en un 10% el sueldo base de todos los desarrolladores (categoría 'IT').

UPDATE empleados
SET salario = salario * 1.10
WHERE id_depto IN (
    SELECT id
    FROM departamentos
    WHERE nombre_depto = 'IT'
);

No hay comentarios:

Publicar un comentario