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