INNER JOIN vs LEFT JOIN

Clase 3 de 26Curso de Gestión de Bases de Datos con SQL Server

Resumen

Conectar tablas con joins es una de las operaciones más frecuentes en SQL, pero un join mal elegido puede ocultar datos sin lanzar ningún error. El resultado parece correcto, los números cuadran y nadie sospecha. Sin embargo, la consulta está respondiendo la pregunta equivocada. Comprender la diferencia entre inner join y left join es fundamental para evitar reportes con datos incompletos.

¿Qué diferencia hay entre inner join y left join?

Antes de escribir cualquier consulta conviene tener claros ambos conceptos [0:42].

  • Inner join: devuelve únicamente las filas que tienen coincidencia en ambas tablas. Si una fila de la tabla izquierda no tiene par en la derecha, desaparece del resultado en silencio, sin error ni advertencia.
  • Left join: devuelve todas las filas de la tabla izquierda y, donde exista coincidencia, agrega los valores de la tabla derecha. Donde no hay coincidencia, devuelve NULL.

Este comportamiento silencioso del inner join es el punto crítico. Cuando una fila no tiene par, simplemente no aparece. Eso significa que puedes estar tomando decisiones de negocio con información parcial sin saberlo.

¿Cómo un inner join puede ocultar clientes reales?

El ejemplo se basa en un escenario de la base de datos Tienda Latam [1:12]. Un gerente de ventas solicita: "Dame el total de ventas de todos nuestros clientes". El analista escribe algo como esto:

sql SELECT c.cliente_id, c.nombre, SUM(p.total) AS total_compras FROM clientes c INNER JOIN pedidos p ON c.cliente_id = p.cliente_id GROUP BY c.cliente_id, c.nombre;

La respuesta parece correcta: se obtienen IDs, nombres y totales. Pero hay un problema. Los clientes que nunca hicieron un pedido no aparecen porque el inner join los descarta al no encontrar coincidencia en la tabla de pedidos [2:07].

¿Qué sucede al cambiar a left join?

Al reemplazar INNER JOIN por LEFT JOIN, la consulta muestra a todos los clientes, incluso aquellos sin pedidos [2:30]:

sql SELECT c.cliente_id, c.nombre, COUNT(p.pedido_id) AS cantidad_pedidos, SUM(p.total) AS total_compras FROM clientes c LEFT JOIN pedidos p ON c.cliente_id = p.cliente_id GROUP BY c.cliente_id, c.nombre;

El resultado revela clientes como Horacio, Luciana y Benjamín, todos con cero pedidos [2:50]. Siguen siendo clientes del negocio, pero el inner join los eliminaba por completo del reporte.

¿Cómo verificar la diferencia en tus propias consultas?

Una técnica sencilla es alternar entre INNER JOIN y LEFT JOIN en la misma consulta y comparar el número de filas [3:10].

  • Con inner join: ningún cliente muestra cero pedidos.
  • Con left join: aparecen los clientes sin actividad.

Si la cantidad de filas cambia al hacer el cambio, eso confirma que existen registros en la tabla izquierda sin coincidencia en la tabla derecha. Esa diferencia puede representar clientes inactivos, empleados sin asignaciones o productos sin ventas, dependiendo del contexto.

¿Por qué importa esta diferencia para el negocio?

Un reporte que usa inner join cuando debería usar left join subestima la realidad. En el ejemplo, el gerente pidió información de "todos los clientes", pero recibió solo los que compraron. Eso distorsiona métricas como la tasa de conversión, el alcance de campañas o la cobertura de atención.

La regla práctica es clara: si necesitas todos los registros de una tabla, independientemente de que tengan relación con la otra, usa left join. Si solo necesitas los registros que tienen coincidencia en ambas tablas, inner join es la opción correcta.

El desafío propuesto es escribir ambas versiones de la consulta sobre la tabla de empleados de Tienda Latam, comparar cuántos registros aparecen en cada una y reflexionar sobre qué significa esa diferencia para el negocio. Comparte tus resultados y tu análisis en los comentarios.