Aprende SQL

JOINs externos: LEFT, RIGHT y FULL OUTER JOIN

Lección 02 · Uniones y valores nulos

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:

INNER JOIN
Solo coincidencias
LEFT JOIN
Todo de A + coincidencias de B
RIGHT JOIN
Todo de B + coincidencias de A
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

id name country founded_year
1 Nintendo Japón 1889
2 Square Enix Japón 1975
10 Santa Monica Studio Estados Unidos 1999
11 Team Cherry Australia 2014

Nombre de la Tabla: videogames

id title developer_id year playtime_hours
1 The Legend of Zelda 1 1986 20
12 God of War 10 2018 25
13 Indie Game NULL 2022 5

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?”.

Tablas de esta lección

developers4 cols

Estructura

🔑idINTEGERnameTEXTcountryTEXTfounded_yearINTEGER

Datos de ejemplo (5 filas)

idnamecountryfounded_year
1NintendoJapón1889
2Square EnixJapón1975
3CD Projekt RedPolonia1994
4Mojang StudiosSuecia2009
5Rockstar GamesEstados Unidos1998
6FromSoftwareJapón1986
7ValveEstados Unidos1996
8Naughty DogEstados Unidos1984
9BungieEstados Unidos1991
10Santa Monica StudioEstados Unidos1999
11Team CherryAustralia2014
videogames5 cols

Estructura

🔑idINTEGERtitleTEXTdeveloper_idINTEGERyearINTEGERplaytime_hoursINTEGER

Datos de ejemplo (5 filas)

idtitledeveloper_idyearplaytime_hours
1The Legend of Zelda1198620
2Super Mario Bros.1198510
3Final Fantasy VII2199740
4The Witcher 332015100
5Minecraft420119999
6Grand Theft Auto V5201380
7Dark Souls6201160
8Portal 2720118
9Red Dead Redemption 25201870
10The Last of Us8201315
11Halo: Combat Evolved9200110
12God of War10201825
13Indie GameNULL20225

Ejercicios

Usa LEFT JOIN para mostrar el título de todos los videojuegos y el nombre de su desarrollador. Incluye también los juegos sin desarrollador asignado (mostrarán NULL en el nombre).

sql

Encuentra los videojuegos que NO tienen desarrollador asignado. Muestra solo el título.

sql

Usa RIGHT JOIN para mostrar todos los desarrolladores y los títulos de sus juegos (incluyendo desarrolladores sin juegos).

sql

Usa FULL OUTER JOIN para mostrar el título de los juegos y el nombre de los desarrolladores, incluyendo los que no tienen coincidencias.

sql