Dada la siguiente estructura de una base de datos relacional:

y las tablas siguientes:

¿Qué salida dará el siguiente programa en SQL?
SELECT CONCAT(Estudiantes.nombre, ‘ ‘, Estudiantes.apellido) AS nombre_completo,
Cursos.nombre_curso,
Cursos.créditos
FROM Inscripciones
JOIN Estudiantes ON Inscripciones.id_estudiante = Estudiantes.id_estudiante
JOIN Cursos ON Inscripciones.id_curso = Cursos.id_curso
WHERE Cursos.créditos > 20;
Esta cuestión apareció en la prueba práctica del examen de oposiciones para profesor de Tecnología en Castilla y León 2025
Si estás empezando en el mundo de las bases de datos, seguramente te has topado con el lenguaje SQL. A primera vista, parece simple inglés, pero el «diablo está en los detalles». Hoy vamos a resolver un reto práctico utilizando una estructura de inscripciones universitarias para entender cómo una sola línea de código puede cambiar todo tu resultado.
El Escenario: Nuestra Base de Datos
Imagina que gestionamos una pequeña academia. Tenemos tres tablas clave relacionadas entre sí:
- Estudiantes: El censo de alumnos (id, nombre, apellido, etc.).
- Cursos: El catálogo de materias y su valor en créditos.
- Inscripciones: La «tabla puente» que nos dice qué alumno está en qué curso.
El Reto SQL
Nos han pedido generar un reporte de los alumnos inscritos, pero con una condición de negocio específica: solo queremos ver aquellos cursos que tengan una carga académica superior a 20 créditos.
Aquí está el código que ejecutaremos:
SQL
SELECT CONCAT(Estudiantes.nombre, ' ', Estudiantes.apellido) AS nombre_completo,
Cursos.nombre_curso,
Cursos.créditos
FROM Inscripciones
JOIN Estudiantes ON Inscripciones.id_estudiante = Estudiantes.id_estudiante
JOIN Cursos ON Inscripciones.id_curso = Cursos.id_curso
WHERE Cursos.créditos > 20;
Análisis de la Ejecución (Paso a Paso)
¿Por qué este programa devuelve unos nombres y otros no? Vamos a hacer de «compiladores humanos»:
1. El filtro de los créditos (WHERE > 20)
El motor de la base de datos mira primero la tabla de Cursos. Aunque tenemos Matemáticas e Inglés, ambos tienen exactamente 20 créditos. Como nuestra condición es «mayor que» (>), estos quedan descartados. Solo sobreviven:
- Historia (30 créditos)
- Tecnología (25 créditos)
2. Cruzando la información (JOIN)
Ahora, el sistema busca en la tabla Inscripciones quiénes están apuntados a esos IDs específicos (20 y 40).
- Encontramos que el estudiante con ID 3 está en Historia.
- El estudiante con ID 2 está en Tecnología.
3. Formateando el resultado (CONCAT)
Finalmente, el SELECT une el nombre y el apellido para presentarlo de forma elegante.
El Resultado Final
Tras procesar los datos, la salida que vería el usuario en su terminal sería esta:
| nombre_completo | nombre_curso | créditos |
| Luis García | Historia | 30 |
| Juan Pérez | Tecnología | 25 |
💡 Lección del día: ¡Cuidado con los operadores!
Si el administrador hubiera querido incluir los cursos de 20 créditos, el operador debería haber sido >= (mayor o igual). En SQL, un solo símbolo puede ser la diferencia entre un reporte completo y uno vacío.
¿Te ha servido esta explicación? Si quieres que profundicemos en otros tipos de uniones como el LEFT JOIN o cómo manejar fechas, ¡déjamelo en los comentarios!

