Tabla de contenido

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:

idnombreciudad_id
1Pedrito Pérez1
2Juanita López2
3Andrés Hernández1
4María GarcíaNULL

Tabla ciudades:

idnombre
1Cancún
2Mérida
3CDMX

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:

nombreciudad
Pedrito PérezCancún
Juanita LópezMérida
Andrés HernándezCancú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:

nombreciudad
Pedrito PérezCancún
Juanita LópezMérida
Andrés HernándezCancún
María GarcíaNULL

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:

nombreciudad
Pedrito PérezCancún
Andrés HernándezCancún
Juanita LópezMérida
NULLCDMX

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.