Aprende SQL

JOINs externos: LEFT, RIGHT y FULL OUTER JOIN

El INNER JOIN solo muestra filas con coincidencias en ambas tablas. Los JOINs externos permiten incluir también filas sin coincidencia. Cada tipo selecciona una región diferente:

A B
INNER JOIN Solo coincidencias
A B
LEFT JOIN Todo de A + coincidencias de B
A B
RIGHT JOIN Todo de B + coincidencias de A
A B
FULL OUTER JOIN Todo de ambas tablas

Donde A es la tabla del FROM (izquierda) y B la tabla del JOIN (derecha). Veamos cada uno en detalle.

LEFT JOIN

Devuelve todas las filas de la tabla izquierda (A), y las coincidencias de la derecha (B). Si no hay coincidencia, muestra NULL:

SELECT columnas
FROM tabla_izquierda
LEFT JOIN tabla_derecha ON condición;

RIGHT JOIN

Lo opuesto: devuelve todas las filas de la tabla derecha (B):

SELECT columnas
FROM tabla_izquierda
RIGHT JOIN tabla_derecha ON condición;

FULL OUTER JOIN

Devuelve todas las filas de ambas tablas, con NULL donde no haya coincidencia:

SELECT columnas
FROM tabla1
FULL OUTER JOIN tabla2 ON condición;

Nuestras tablas

Ahora tenemos un juego sin desarrollador asignado y un desarrollador sin juegos:

Nombre de la Tabla: developers
idnamecountryfounded_year
1NintendoJapón1889
2Square EnixJapón1975
10Santa Monica StudioEstados Unidos1999
11Team CherryAustralia2014
Nombre de la Tabla: videogames
idtitledeveloper_idyearplaytime_hours
1The Legend of Zelda1198620
12God of War10201825
13Indie GameNULL20225

Observa que Indie Game no tiene developer_id (es NULL) y Team Cherry no tiene ningún juego asociado.

Ejemplo de LEFT JOIN

SELECT videogames.title, developers.name
FROM videogames
LEFT JOIN developers ON videogames.developer_id = developers.id;

Esto mostrará todos los juegos, incluyendo “Indie Game” con NULL como nombre de desarrollador.

¿Cuándo usar cada tipo de JOIN?

Elegir el JOIN correcto es una de las decisiones más importantes al escribir consultas:

  • INNER JOIN: cuando solo necesitas datos que tengan coincidencia en ambas tablas. Es el más común con diferencia (~90% de los casos). Ejemplo: “muéstrame los juegos con su desarrollador”.
  • LEFT JOIN: cuando necesitas todas las filas de la tabla principal, aunque no tengan coincidencia en la otra tabla. Ejemplo: “todos los usuarios y sus pedidos, incluso los usuarios que nunca compraron nada”.
  • RIGHT JOIN: hace lo mismo que LEFT JOIN pero al revés. En la práctica se usa muy poco porque siempre puedes reescribirlo como un LEFT JOIN simplemente intercambiando el orden de las tablas.
  • FULL OUTER JOIN: cuando necesitas todo de ambos lados, con o sin coincidencia. Es bastante raro en aplicaciones reales.

El patrón anti-join

Un truco muy útil es combinar LEFT JOIN con WHERE ... IS NULL para encontrar registros sin coincidencia. A esto se le llama anti-join:

SELECT v.title
FROM videogames v
LEFT JOIN developers d ON v.developer_id = d.id
WHERE d.id IS NULL;

Esta consulta devuelve solo los juegos que no tienen desarrollador asignado. Es la forma estándar de responder a preguntas como “¿qué clientes no han hecho ningún pedido?” o “¿qué productos no se han vendido nunca?”.

Ejercicios