JOIN en SQL: INNER JOIN, LEFT JOIN y RIGHT JOIN con ejemplos claros


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 columna curso_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

  1. mostrar alumno y curso;
  2. mostrar todos los alumnos aunque no tengan curso;
  3. mostrar cursos sin alumnos;
  4. 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:

☕ Apoyar con Mercado Pago

🌎 Apoyar con PayPal


Ruta SQL / MySQL

Ver todos los contenidos de SQL / MySQL

← Funciones de agregación

Subconsultas en SQL →


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”

Deja un comentario

Descubre más desde Club Programador

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo