Diferencia entre LEFT JOIN e INNER JOIN
Por FelipePublicado en:
La diferencia entre LEFT JOIN e INNER JOIN está en las filas que devuelven. INNER JOIN muestra solo los registros con coincidencia en ambas tablas, mientras que LEFT JOIN devuelve todas las filas de la tabla de la izquierda —tengan o no correspondencia en la derecha— y completa con valores nulos cuando no la encuentra.
Para qué sirve el JOIN en SQL
En una base de datos relacional como MySQL, la información se reparte en varias tablas para evitar duplicidades. La cláusula JOIN cumple la función de combinar filas de distintas tablas asociando un campo común entre ellas, normalmente una clave que se repite en ambas (por ejemplo, el identificador de un cliente presente tanto en la tabla de clientes como en la de pedidos).
Gracias a los JOIN puedes responder preguntas que afectan a varias tablas a la vez, como «qué pedidos ha hecho cada cliente» o «qué productos no se han vendido nunca», sin necesidad de duplicar datos ni de lanzar varias consultas por separado.
Este enfoque, conocido como normalización, mantiene la base de datos ordenada y coherente: cada dato se almacena una sola vez y las relaciones se reconstruyen en el momento de la consulta mediante JOIN. Dominar estas combinaciones es esencial para cualquier desarrollo que trabaje con MySQL o MariaDB, desde una tienda online hasta un panel de gestión interno.
Tipos de JOIN en MySQL
MySQL admite varios tipos de combinación, y elegir el adecuado depende de qué filas necesites conservar en el resultado.
INNER JOIN
Con INNER JOIN se obtienen todas las filas en las que se produce una coincidencia entre las dos tablas. Si un registro de una tabla no tiene pareja en la otra, simplemente no aparece en el resultado. Es el tipo más habitual cuando solo te interesan los datos que están relacionados en ambos lados.
Ejemplo: SELECT clientes.nombre, pedidos.total FROM clientes INNER JOIN pedidos ON clientes.id = pedidos.cliente_id;
LEFT JOIN
El LEFT JOIN (o LEFT OUTER JOIN) devuelve todas las filas de la tabla de la izquierda y las filas que coincidan de la tabla de la derecha. Cuando no hay coincidencia, las columnas de la tabla derecha se rellenan con NULL. Resulta muy útil para detectar registros «huérfanos», como clientes que todavía no han realizado ningún pedido.
Ejemplo: SELECT clientes.nombre, pedidos.total FROM clientes LEFT JOIN pedidos ON clientes.id = pedidos.cliente_id;
RIGHT JOIN
El RIGHT JOIN funciona a la inversa: devuelve todas las filas de la tabla de la derecha y las que coincidan de la tabla de la izquierda. En la práctica se usa menos, ya que casi siempre puede reescribirse como un LEFT JOIN invirtiendo el orden de las tablas.
OUTER JOIN
El OUTER JOIN (FULL OUTER JOIN) presenta todas las filas de ambas tablas, izquierda y derecha; es decir, es una combinación entre LEFT JOIN y RIGHT JOIN. MySQL no lo implementa de forma nativa, por lo que suele simularse uniendo un LEFT JOIN y un RIGHT JOIN con la sintaxis UNION.
Diferencia entre LEFT JOIN e INNER JOIN
La clave para distinguirlos está en pensar en conjuntos. El INNER JOIN representa la intersección: solo las filas presentes en ambas tablas. El LEFT JOIN representa la tabla izquierda completa más su intersección con la derecha. Por eso, ante los mismos datos, un LEFT JOIN nunca devolverá menos filas que un INNER JOIN; como mucho devolverá las mismas (si todas las filas tienen coincidencia) o más (añadiendo las que no la tienen, con valores nulos).
En términos prácticos: usa INNER JOIN cuando solo te interese la información relacionada en las dos tablas, y LEFT JOIN cuando necesites conservar todos los registros de la tabla principal aunque algunos no tengan datos asociados. Un error frecuente es aplicar después un filtro WHERE sobre una columna de la tabla derecha en un LEFT JOIN, ya que eso descarta las filas con NULL y convierte el resultado, en la práctica, en un INNER JOIN.
Ejemplo práctico paso a paso
Imagina dos tablas: clientes (con los campos id y nombre) y pedidos (con id, cliente_id y total). Supón que tienes tres clientes —Ana, Luis y Marta— pero solo Ana y Luis han realizado pedidos.
Si ejecutas un INNER JOIN, el resultado mostrará únicamente las filas de Ana y Luis junto a sus pedidos; Marta no aparecerá, porque no tiene ninguna coincidencia en la tabla de pedidos. En cambio, con un LEFT JOIN aparecerán los tres clientes: Ana y Luis con sus importes y Marta con el campo total a NULL. Este contraste deja clara la diferencia: el LEFT JOIN conserva la lista completa de clientes, mientras que el INNER JOIN se queda solo con quienes han comprado.
Errores comunes al combinar tablas
Más allá del filtro WHERE que «anula» un LEFT JOIN, hay otros descuidos frecuentes. Uno es olvidar la condición ON y provocar un producto cartesiano, que multiplica todas las filas de una tabla por las de la otra y genera resultados enormes. Otro es enlazar por columnas con tipos de datos distintos, lo que impide aprovechar los índices y ralentiza la consulta. Por último, conviene nombrar de forma explícita las columnas en el SELECT en lugar de usar un asterisco, para que el resultado sea más legible y eficiente cuando se combinan muchas tablas.
Rendimiento de las consultas con JOIN
A medida que crecen las tablas, la eficiencia de los JOIN depende mucho de tener índices en las columnas que se usan para enlazar y de los recursos del servidor. Contar con una base de datos MySQL bien dimensionada en tu alojamiento web ayuda a que estas consultas se resuelvan con rapidez, sobre todo en proyectos con muchas operaciones simultáneas. Las soluciones con discos NVMe y tecnología LiteSpeed de HostingPlus están pensadas para ofrecer buenos tiempos de respuesta en este tipo de cargas.
Preguntas frecuentes
¿LEFT JOIN devuelve siempre más filas que INNER JOIN?
No siempre más, pero nunca menos. Si todas las filas de la tabla izquierda tienen coincidencia en la derecha, ambos devuelven el mismo número de filas. En cuanto existe alguna fila sin correspondencia, el LEFT JOIN añade esos registros con valores nulos.
¿Cuándo conviene usar INNER JOIN?
Cuando solo te interesan los datos relacionados en las dos tablas y no necesitas conservar los registros sin pareja. Por ejemplo, para listar únicamente los clientes que sí han realizado pedidos.
¿MySQL admite FULL OUTER JOIN?
No de forma nativa. Para obtener el resultado de un FULL OUTER JOIN en MySQL se combinan un LEFT JOIN y un RIGHT JOIN mediante UNION, lo que devuelve todas las filas de ambas tablas, coincidan o no.
Hosting en España con soporte real en español, migración gratis, SSL incluido y 30 días de garantía. Sin líos y sin costes ocultos.
Ver planes de hosting →
