Tabla de contenido
- ¿Por qué necesitamos los JOINs?
- Las tablas de ejemplo
- INNER JOIN: solo los que coinciden
- LEFT JOIN: todos los de la izquierda
- RIGHT JOIN: todos los de la derecha
- ¿Cuándo usar cada uno?
- JOINs con múltiples tablas
Si ya sabes hacer consultas básicas en MySQL pero tus datos están repartidos en varias tablas, necesitas conocer los JOINs. Son la herramienta fundamental para combinar información de múltiples tablas en una sola consulta.
¿Por qué necesitamos los JOINs?
En una base de datos bien diseñada, la información se distribuye en varias tablas relacionadas entre sí (recuerda la normalización que vimos en otro artículo). Por ejemplo, no guardamos el nombre de la ciudad dentro de la tabla de usuarios, sino que guardamos el ID de la ciudad y tenemos una tabla separada de ciudades.
Esta separación es buena para evitar redundancia, pero a la hora de mostrar los datos necesitamos “unir” esas tablas. Ahí es donde entran los JOINs.
Las tablas de ejemplo
Para todos los ejemplos vamos a usar estas dos tablas:
Tabla usuarios:
| id | nombre | ciudad_id |
|---|---|---|
| 1 | Pedrito Pérez | 1 |
| 2 | Juanita López | 2 |
| 3 | Andrés Hernández | 1 |
| 4 | María García | NULL |
Tabla ciudades:
| id | nombre |
|---|---|
| 1 | Cancún |
| 2 | Mérida |
| 3 | CDMX |
Observa que María García no tiene ciudad asignada (NULL) y la ciudad CDMX existe pero ningún usuario la tiene asignada. Estos casos de borde son los que hacen la diferencia entre los tipos de JOIN.
INNER JOIN: solo los que coinciden
El INNER JOIN devuelve únicamente los registros que tienen coincidencia en ambas tablas.
SELECT usuarios.nombre, ciudades.nombre AS ciudad
FROM usuarios
INNER JOIN ciudades ON usuarios.ciudad_id = ciudades.id;
SQL
Resultado:
| nombre | ciudad |
|---|---|
| Pedrito Pérez | Cancún |
| Juanita López | Mérida |
| Andrés Hernández | Cancún |
María García no aparece porque su ciudad_id es NULL. CDMX tampoco aparece porque ningún usuario la tiene asignada.
LEFT JOIN: todos los de la izquierda
El LEFT JOIN devuelve todos los registros de la tabla izquierda y los registros coincidentes de la tabla derecha. Si no hay coincidencia, las columnas de la tabla derecha aparecen como NULL.
SELECT usuarios.nombre, ciudades.nombre AS ciudad
FROM usuarios
LEFT JOIN ciudades ON usuarios.ciudad_id = ciudades.id;
SQL
Resultado:
| nombre | ciudad |
|---|---|
| Pedrito Pérez | Cancún |
| Juanita López | Mérida |
| Andrés Hernández | Cancún |
| María García | NULL |
Ahora María García aparece con NULL en ciudad. CDMX sigue sin aparecer.
RIGHT JOIN: todos los de la derecha
El RIGHT JOIN devuelve todos los registros de la tabla derecha y los registros coincidentes de la tabla izquierda.
SELECT usuarios.nombre, ciudades.nombre AS ciudad
FROM usuarios
RIGHT JOIN ciudades ON usuarios.ciudad_id = ciudades.id;
SQL
Resultado:
| nombre | ciudad |
|---|---|
| Pedrito Pérez | Cancún |
| Andrés Hernández | Cancún |
| Juanita López | Mérida |
| NULL | CDMX |
Ahora CDMX aparece con NULL en nombre de usuario.
¿Cuándo usar cada uno?
- Usa INNER JOIN cuando solo te interesen los registros que tienen relación en ambas tablas (el caso más común)
- Usa LEFT JOIN cuando necesites todos los registros de la tabla principal aunque no tengan datos relacionados
- Usa RIGHT JOIN cuando necesites todos los registros de la tabla relacionada (es menos común, generalmente se puede reescribir como LEFT JOIN invirtiendo el orden)
JOINs con múltiples tablas
Puedes encadenar varios JOINs para combinar más de dos tablas:
SELECT
usuarios.nombre AS usuario,
ciudades.nombre AS ciudad,
pedidos.total
FROM usuarios
INNER JOIN ciudades ON usuarios.ciudad_id = ciudades.id
LEFT JOIN pedidos ON usuarios.id = pedidos.usuario_id;
SQL
Aquí combinamos tres tablas: obtenemos el nombre del usuario, su ciudad y sus pedidos. Es recomendable usar alias (AS) cuando tienes columnas con el mismo nombre en diferentes tablas.
Los JOINs son uno de los conceptos más importantes en SQL y dominarlos te permitirá hacer consultas mucho más potentes y eficientes en tus bases de datos.