JOIN en SQL para GSI: INNER, LEFT y el filtro ON frente a WHERE
Respuesta directa: para resolver una consulta JOIN en SQL, identifica primero qué fila de una tabla se relaciona con cuál de la otra, escribe la condición en ON y decide qué filas deben conservarse. INNER JOIN devuelve las coincidencias; LEFT JOIN conserva además las filas de la tabla izquierda que no tienen pareja, con NULL en las columnas de la derecha. Practicar con tres o cuatro filas antes de ejecutar la consulta ayuda a detectar errores de lógica.
Si preparas Gestión de Sistemas e Informática de la Administración del Estado (GSI), este ejercicio conecta el modelo relacional con las consultas SQL. El anexo IX de la convocatoria de 18 de diciembre de 2025 publicada en el BOE incluye «El lenguaje SQL» en el bloque de tecnología básica. Consulta siempre el programa aplicable a tu proceso: aquí trabajamos una técnica concreta de estudio, sin anticipar preguntas de examen.
Qué significa unir tablas en SQL
Una unión combina filas de dos tablas según una condición. Imagina una tabla personas y otra matriculas. La primera guarda una fila por persona; la segunda guarda cada matrícula. El campo matriculas.persona_id permite encontrar a quién corresponde cada matrícula. Para repasar la relación entre identificadores, puedes consultar nuestra guía de clave primaria y clave foránea.
Usaremos estos datos inventados, solo para aprender a razonar sobre el resultado:
| personas.id | nombre |
|---|---|
| 1 | Ana |
| 2 | Beto |
| 3 | Cora |
| matriculas.id | persona_id | curso |
|---|---|---|
| 10 | 1 | Redes |
| 11 | 1 | SQL |
| 12 | 3 | Seguridad |
Ana tiene dos matrículas, Beto ninguna y Cora una. Esta distribución evita una trampa frecuente: creer que toda unión devuelve una sola fila por persona. La relación puede ser de uno a varios.
INNER JOIN: solo filas con pareja
SELECT p.nombre, m.curso
FROM personas AS p
INNER JOIN matriculas AS m
ON p.id = m.persona_id;
La condición p.id = m.persona_id compara las claves de ambas tablas. El resultado tiene tres filas: Ana–Redes, Ana–SQL y Cora–Seguridad. Beto no aparece porque no tiene una matrícula que satisfaga la condición. La documentación oficial de PostgreSQL sobre tablas unidas describe precisamente esa regla de coincidencia.
Antes de mirar las opciones de un test, cuenta las parejas posibles: el identificador 1 encuentra dos, el 2 ninguna y el 3 una. Así llegas a tres filas sin memorizar una respuesta aislada. Si una persona tuviera tres matrículas, aparecería tres veces en esta selección; no sería un duplicado accidental, sino una fila por cada pareja válida.
LEFT JOIN: conservar la tabla de la izquierda
SELECT p.nombre, m.curso
FROM personas AS p
LEFT JOIN matriculas AS m
ON p.id = m.persona_id;
Ahora aparecen cuatro filas: las tres coincidencias anteriores y una fila adicional para Beto. En esa última fila, m.curso vale NULL porque no existe una matrícula asociada. En una unión externa izquierda se conservan las filas de personas, la tabla situada a la izquierda del JOIN; eso no implica una sola fila por persona, ya que Ana conserva sus dos coincidencias.
| Tipo | Qué conserva en este ejemplo | Filas |
|---|---|---|
INNER JOIN |
Solo personas con matrícula | 3 |
LEFT JOIN |
Todas las personas y sus matrículas, si las hay | 4 |
Para localizar a quienes no tienen matrícula, filtra una columna de la tabla derecha que solo puede ser nula cuando falta la fila relacionada; aquí usamos su identificador:
SELECT p.nombre
FROM personas AS p
LEFT JOIN matriculas AS m
ON p.id = m.persona_id
WHERE m.id IS NULL;
El resultado es Beto. Conviene distinguir entre «no existe una fila en la tabla derecha» y «existe una fila cuyo dato está vacío». El filtro sobre m.id expresa con claridad el primer caso cuando ese identificador es clave primaria.
El detalle que cambia el resultado: ON frente a WHERE
En un LEFT JOIN, la posición de un filtro sobre la tabla derecha importa. Compara estas consultas:
SELECT p.nombre, m.curso
FROM personas AS p
LEFT JOIN matriculas AS m
ON p.id = m.persona_id
AND m.curso = 'SQL';
SELECT p.nombre, m.curso
FROM personas AS p
LEFT JOIN matriculas AS m
ON p.id = m.persona_id
WHERE m.curso = 'SQL';
La primera conserva a Ana, Beto y Cora: Ana queda asociada a SQL; para Beto y Cora, m.curso aparece como NULL al no haber coincidencia que cumpla el filtro. La segunda devuelve solo Ana, porque WHERE elimina después las filas cuyo m.curso no sea SQL, incluidas las filas con NULL. La documentación de PostgreSQL muestra esta diferencia entre filtrar en ON y hacerlo en WHERE para una unión externa.
Una regla práctica: si el enunciado pide mantener todas las filas de la izquierda y mostrar solo determinadas coincidencias de la derecha, examina el filtro en ON. Si pide descartar del resultado final las filas que no cumplan una condición, examina WHERE. Confirma la interpretación dibujando primero el resultado esperado; la regla verbal por sí sola no sustituye el razonamiento.
Cómo estudiar JOIN sin aprender consultas de memoria
- Dibuja dos tablas pequeñas. Incluye una fila sin pareja y otra con dos parejas. Así compruebas tanto la ausencia de coincidencia como la multiplicación de filas.
- Marca la relación. Señala qué columna identifica a la persona y qué columna la referencia en matrícula. Escribe después la igualdad de
ON. - Formula la pregunta en lenguaje natural. «Solo personas matriculadas» apunta a una unión interna; «todas las personas, aunque no estén matriculadas» apunta a una unión izquierda.
- Cuenta las filas a mano. Haz una tabla de resultados antes de ejecutar SQL. Si tu predicción y el resultado difieren, identifica la primera fila que explica el cambio.
- Varía una condición cada vez. Mueve un filtro de
ONaWHERE, añade una segunda matrícula o elimina una existente. Explica el efecto en voz alta.
Este método convierte un concepto abstracto en decisiones comprobables. Después puedes practicar preguntas tipo test sobre qué filas aparecen, crear flashcards breves para recordar el comportamiento de INNER y LEFT, y usar audio-podcasts para repasar la idea antes de volver a escribir las consultas. Si fallas una pregunta, anota si confundiste la condición de unión, el filtro o el número de parejas; nuestra guía para analizar errores en tests GSI desarrolla ese hábito.
Errores frecuentes al resolver preguntas de JOIN
- Confundir la tabla conservada. En
LEFT JOINse preservan las filas de la tabla a la izquierda de la palabraJOIN. Cambiar el orden de las tablas cambia el significado de «izquierda». - Contar personas en vez de filas. Una persona con dos matrículas genera dos parejas; antes de responder, mira si se pregunta por filas, personas distintas o valores agregados.
- Olvidar la condición de unión. Sin una relación adecuada, la consulta puede combinar filas que no corresponden al objetivo. Comprueba siempre qué columnas se comparan.
- Tratar
NULLcomo un texto.NULLindica ausencia de valor; para buscarlo se usaIS NULL, no= NULL. - Filtrar demasiado pronto con
WHERE. En una unión externa, una condición posterior sobre la tabla derecha puede eliminar las filas que esperabas conservar.
Preguntas frecuentes
¿INNER JOIN y JOIN significan lo mismo?
En la sintaxis descrita por PostgreSQL, INNER es opcional: JOIN sin otro tipo indicado es una unión interna. Escribir INNER JOIN puede ayudar a hacer explícita la intención al estudiar.
¿LEFT JOIN devuelve siempre tantas filas como la tabla izquierda?
No. Devuelve al menos una fila por cada fila izquierda, pero una fila puede aparecer varias veces si encuentra varias coincidencias a la derecha. En nuestro ejemplo, tres personas generan cuatro filas.
¿Debo estudiar también RIGHT JOIN y FULL JOIN?
Conviene entender el principio de las uniones externas: RIGHT JOIN conserva la tabla derecha y FULL JOIN conserva las filas sin pareja de ambos lados. Empieza por dominar INNER y LEFT con datos pequeños, y amplía después según el programa y las necesidades de tu preparación.
En PreparaGSI puedes combinar tests, flashcards y audio-podcasts para repasar conceptos como este de forma variada. Úsalos para comprobar lo que entiendes y vuelve al ejemplo de tablas cuando una respuesta no encaje: el objetivo es saber explicar por qué aparece cada fila.
Fuentes: BOE, convocatoria de 18 de diciembre de 2025, anexo IX; documentación oficial de PostgreSQL, «Table Expressions»; documentación oficial de PostgreSQL sobre comparaciones y valores nulos.