En una base de datos relacional, la información normalmente está separada en varias tablas. JOIN permite volver a reunirla cuando necesitamos consultar datos relacionados.
¿Por qué separar tablas?
Supongamos que cada alumno pertenece a un curso. Si guardamos el nombre del curso dentro de cada alumno, repetimos el mismo texto muchas veces.
Una mejor estructura es tener:
- tabla
alumnos; - tabla
cursos; - en
alumnos, una columnacurso_id.
Clave primaria y clave foránea
cursos.id identifica un curso. alumnos.curso_id guarda el identificador del curso relacionado.
Eso crea una relación entre ambas tablas.
Tablas de ejemplo
CREATE TABLE cursos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100)
);
CREATE TABLE alumnos ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100), apellido VARCHAR(100), curso_id INT, FOREIGN KEY (curso_id) REFERENCES cursos(id) );
Una relación concreta con datos
Supongamos que tenemos estos cursos:
cursos id | nombre 1 | Programación 2 | Bases de Datos
Y estos alumnos:
alumnos id | nombre | curso_id 1 | Ana | 1 2 | Juan | 2 3 | Lucía | NULL
El valor curso_id no es el nombre del curso: es una referencia al id de la tabla cursos. JOIN nos permite reconstruir la información legible.
¿Qué hace JOIN?
JOIN combina filas de dos tablas usando una condición de relación.
La idea mental es: “por cada fila de la tabla principal, buscá la fila relacionada en la otra tabla”.
La cláusula ON
ON alumnos.curso_id = cursos.id
ON indica qué columnas deben coincidir.
En este caso, el valor guardado en alumnos.curso_id debe ser igual al identificador cursos.id.
Si la condición de ON está mal, el resultado también estará mal, aunque la consulta no genere ningún error sintáctico.
INNER JOIN
Devuelve solo las filas que tienen coincidencia en ambas tablas.
SELECT a.nombre, a.apellido, c.nombre AS curso FROM alumnos AS a INNER JOIN cursos AS c ON a.curso_id = c.id;
Si un alumno no tiene curso asignado, no aparece.
Con los datos de ejemplo, Ana y Juan aparecerían porque tienen curso; Lucía no, porque su curso_id es NULL.
LEFT JOIN
Devuelve todos los registros de la tabla izquierda, aunque no exista coincidencia.
SELECT a.nombre, c.nombre AS curso FROM alumnos AS a LEFT JOIN cursos AS c ON a.curso_id = c.id;
Si el alumno no tiene curso, la columna curso aparece como NULL.
Por eso LEFT JOIN es muy útil cuando queremos conservar todos los registros principales aunque la relación todavía no exista.
La tabla izquierda y la tabla derecha
En SQL, “izquierda” y “derecha” dependen de cómo está escrita la consulta:
FROM alumnos LEFT JOIN cursos ...
alumnos es la tabla izquierda y cursos la derecha.
RIGHT JOIN
Conserva todos los registros de la tabla derecha.
SELECT a.nombre, c.nombre AS curso FROM alumnos AS a RIGHT JOIN cursos AS c ON a.curso_id = c.id;
Alias
Los alias acortan nombres y hacen más legibles las consultas.
FROM alumnos AS a INNER JOIN cursos AS c
ON y WHERE no cumplen la misma función
ON define cómo se relacionan las tablas. WHERE filtra el resultado.
Esta diferencia es especialmente importante con LEFT JOIN, porque mover una condición de ON a WHERE puede cambiar qué filas sobreviven.
JOIN con WHERE
SELECT a.nombre, c.nombre AS curso FROM alumnos AS a INNER JOIN cursos AS c ON a.curso_id = c.id WHERE c.nombre = 'Programación';
Encontrar registros sin relación
LEFT JOIN combinado con IS NULL es muy útil.
SELECT a.nombre FROM alumnos AS a LEFT JOIN cursos AS c ON a.curso_id = c.id WHERE c.id IS NULL;
JOIN con agregaciones
SELECT c.nombre, COUNT(a.id) AS cantidad_alumnos FROM cursos AS c LEFT JOIN alumnos AS a ON c.id = a.curso_id GROUP BY c.id, c.nombre;
¿Por qué pueden aparecer filas repetidas?
JOIN no “pega una fila con una fila” necesariamente. En una relación uno a muchos, una fila de la tabla izquierda puede producir varias filas en el resultado.
Por ejemplo, si un curso tiene 30 alumnos, una consulta que une cursos con alumnos puede devolver 30 filas para ese curso.
Más de dos tablas
Una consulta puede encadenar varios JOIN. Por ejemplo: alumno → curso → profesor.
INNER, LEFT o RIGHT: ¿cuál usar?
- INNER JOIN: solo coincidencias.
- LEFT JOIN: todos los de la izquierda.
- RIGHT JOIN: todos los de la derecha.
Errores comunes
- olvidar ON;
- relacionar columnas incorrectas;
- confundir LEFT con INNER;
- no entender los NULL;
- usar SELECT * cuando varias tablas tienen columnas del mismo nombre.
Ejercicios
- mostrar alumno y curso;
- mostrar todos los alumnos aunque no tengan curso;
- mostrar cursos sin alumnos;
- contar alumnos por curso.
¿Qué sigue?
Subconsultas en SQL.
¿Te sirvió esta guía? ☕
Si este contenido te ayudó y querés apoyar a Club Programador para seguir publicando ejercicios, proyectos y guías gratuitas, podés colaborar mediante:
Ruta SQL / MySQL
Ver todos los contenidos de SQL / MySQL
Descubre más desde Club Programador
Suscríbete y recibe las últimas entradas en tu correo electrónico.
2 opiniones en “JOIN en SQL: INNER JOIN, LEFT JOIN y RIGHT JOIN con ejemplos claros”