JOIN en MySQL explicados fácil (INNER, LEFT y RIGHT)


Si trabajas con MySQL, hay un punto que separa a quien “hace que funcione” de quien entiende de verdad las bases de datos:

👉 los JOIN.

Muchos errores de rendimiento, consultas lentas y datos duplicados no vienen de MySQL…

vienen de JOIN mal entendidos o mal usados.

En este artículo vamos a ver INNER JOIN, LEFT JOIN y RIGHT JOIN de forma clara, con ejemplos reales y errores comunes.



¿Qué es un JOIN en MySQL?


Un JOIN sirve para relacionar datos entre dos o más tablas usando un campo en común.

Ejemplo típico:

  • tabla users
  • tabla orders
  • relación: orders.user_id = users.id

Sin JOIN:

  • consultas duplicadas
  • lógica en PHP
  • rendimiento pobre

Con JOIN:

  • datos correctos
  • consultas limpias
  • mejor rendimiento

Tablas de ejemplo (para entenderlo todo)


Tabla users

id	name
1	Ana
2	Luis
3	Marta

Tabla orders

id	user_id	total
10	1	50 €
11	1	30 €
12	2	20 €

👉 Marta no tiene pedidos.



INNER JOIN (el más usado)


El INNER JOIN devuelve solo los registros que existen en ambas tablas.

SELECT u.name, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

Resultado:

name	total
Ana	50 €
Ana	30 €
Luis	20 €

❌ Marta no aparece porque no tiene pedidos.

Cuándo usar INNER JOIN

  • cuando necesitas datos que existen en ambas tablas
  • cuando la relación es obligatoria

LEFT JOIN (el más importante en sistemas reales)


El LEFT JOIN devuelve:

  • todos los registros de la tabla izquierda
  • y los relacionados de la derecha (si existen)
SELECT u.name, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

Resultado:

name	total
Ana	50 €
Ana	30 €
Luis	20 €
Marta	NULL

👉 Marta aparece con NULL porque no tiene pedidos.

Cuándo usar LEFT JOIN

  • listados completos
  • reportes
  • dashboards
  • evitar perder datos

📌 Regla importante:

Si dudas entre INNER y LEFT, usa LEFT.

RIGHT JOIN (el menos usado)


El RIGHT JOIN es lo mismo que un LEFT JOIN… pero al revés.

SELECT u.name, o.total
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

👉 Devuelve todos los pedidos, aunque el usuario no exista.

¿Por qué casi no se usa?

  • Confunde
  • Todo RIGHT JOIN se puede escribir como LEFT JOIN
  • LEFT JOIN es más legible

📌 En la práctica: evítalo.



JOIN + WHERE: el error más común


Mucha gente rompe LEFT JOIN sin saberlo:

SELECT u.name, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.total > 0;

❌ Esto convierte el LEFT JOIN en INNER JOIN.

Solución correcta

SELECT u.name, o.total
FROM users u
LEFT JOIN orders o 
  ON u.id = o.user_id AND o.total > 0;

📌 El filtro de la tabla derecha va en el ON, no en el WHERE.



JOIN y rendimiento (muy importante)


Índices obligatorios

  • Clave primaria
  • Claves foráneas
INDEX(user_id)

Sin índice:

  • JOIN lentísimo
  • table scan
  • CPU al 100 %

JOIN vs subconsultas


❌ Subconsulta típica (lenta):

SELECT name
FROM users
WHERE id IN (
  SELECT user_id FROM orders
);

✅ JOIN equivalente (mejor):

SELECT DISTINCT u.name
FROM users u
JOIN orders o ON u.id = o.user_id;

📌 JOIN suele ser:

  • más rápido
  • más claro
  • más optimizable

Errores comunes con JOIN


❌ Usar SELECT *

❌ JOIN sin índice

❌ JOIN innecesarios

❌ Filtrar mal en WHERE

❌ LEFT convertido en INNER


Checklist de JOIN correctos


✔ Usa LEFT JOIN para listados

✔ INNER JOIN para relaciones obligatorias

✔ Evita RIGHT JOIN

✔ Indexa claves foráneas

✔ Filtra en ON cuando uses LEFT

✔ Usa EXPLAIN siempre


Conclusión:


Los JOIN:

  • no son complicados
  • son mal explicados
  • y mal usados

Entenderlos bien:

👉 mejora rendimiento

👉 reduce bugs

👉 te hace escribir SQL más limpio