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