Dominando SQL: ¿Cómo funcionan realmente los JOIN y los Filtros?

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í:

  1. Estudiantes: El censo de alumnos (id, nombre, apellido, etc.).
  2. Cursos: El catálogo de materias y su valor en créditos.
  3. 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_completonombre_cursocréditos
Luis GarcíaHistoria30
Juan PérezTecnología25

💡 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!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio