Analítica y dashboards

JOINs en SQL: INNER, LEFT, RIGHT y FULL explicados con ejemplos

7 min de lectura
Tipos de JOIN en SQL explicados con ejemplos

Un JOIN en SQL combina filas de dos o más tablas usando una columna en común. Los tipos son: INNER JOIN devuelve solo las filas que existen en ambas tablas; LEFT JOIN devuelve todas las de la tabla izquierda y las coincidencias de la derecha, rellenando con NULL lo que no coincide; RIGHT JOIN hace lo inverso; FULL OUTER JOIN devuelve todo de ambas; CROSS JOIN combina cada fila con cada fila; y SELF JOIN une una tabla consigo misma. El que más se usa es INNER JOIN, y el que más problemas evita es LEFT JOIN, porque no pierde registros de la tabla principal.

Tabla de contenidos

Respuesta rápida: Un JOIN en SQL combina filas de dos o más tablas usando una columna en común. Los tipos son: INNER JOIN devuelve solo las filas que existen en ambas tablas; LEFT JOIN devuelve todas las de la tabla izquierda y las coincidencias de la derecha, rellenando con NULL lo que no coincide; RIGHT JOIN hace lo inverso; FULL OUTER JOIN devuelve todo de ambas; CROSS JOIN combina cada fila con cada fila; y SELF JOIN une una tabla consigo misma. El que más se usa es INNER JOIN, y el que más problemas evita es LEFT JOIN, porque no pierde registros de la tabla principal.

Qué es un JOIN y por qué existe

En una base de datos bien diseñada la información no está toda junta: los clientes están en una tabla, los pedidos en otra y los productos en otra. Eso se hace a propósito para no repetir datos, y lo explico en qué es una base de datos.

El precio de esa organización es que, cuando quieres una respuesta completa, tienes que volver a juntar las piezas. Para eso existe el JOIN: le dices a SQL qué columna tienen en común dos tablas y él arma la fila completa.

Ejemplo: la tabla pedidos guarda el id_cliente pero no el nombre. Para ver el nombre junto al pedido, unes las dos tablas por esa columna.

SELECT p.id_pedido, c.nombre, p.total
FROM pedidos p
INNER JOIN clientes c ON p.id_cliente = c.id_cliente;

La parte del ON es la condición de unión: le dice a SQL qué columna de una tabla corresponde a cuál de la otra. Sin ella, SQL no sabe cómo emparejar las filas.

Los seis tipos de JOIN

TipoQué devuelveCuándo lo usas
INNER JOINSolo las filas que coinciden en ambas tablasCuando te interesa únicamente lo que tiene pareja
LEFT JOINTodas las de la izquierda, más lo que coincida de la derechaCuando no puedes perder ningún registro de la tabla principal
RIGHT JOINTodas las de la derecha, más lo que coincida de la izquierdaCasi nunca: se prefiere invertir el orden y usar LEFT
FULL OUTER JOINTodo de ambas tablas, coincida o noPara auditar y encontrar huérfanos de los dos lados
CROSS JOINCada fila de una con cada fila de la otraPara generar combinaciones, como calendarios por producto
SELF JOINUne una tabla consigo mismaJerarquías: empleado y su jefe en la misma tabla

INNER vs LEFT: la diferencia que de verdad importa

Si solo vas a entender una cosa de este artículo, que sea esta.

Imagina 100 clientes, de los cuales 70 hicieron pedidos y 30 nunca compraron.

  • INNER JOIN entre clientes y pedidos te devuelve 70 clientes. Los 30 que no compraron desaparecen del resultado.
  • LEFT JOIN te devuelve los 100. Los 30 que no compraron aparecen con NULL en las columnas de pedido.

Y aquí está el error caro: si tu reporte usa INNER JOIN y alguien pregunta "¿cuántos clientes tenemos?", la respuesta va a ser 70. Nadie va a notar que faltan 30, porque el resultado se ve perfectamente normal.

Mi regla en clase: cuando dudes, usa LEFT JOIN. Si sobran filas con NULL las ves y las filtras. Si faltan filas, no las ves nunca.

RIGHT JOIN: por qué casi nadie lo usa

RIGHT JOIN hace exactamente lo mismo que LEFT pero al revés. Y justamente por eso casi no se usa: en vez de escribir un RIGHT JOIN, se cambia el orden de las tablas y se escribe un LEFT.

Estas dos consultas devuelven lo mismo:

SELECT * FROM pedidos p RIGHT JOIN clientes c ON p.id_cliente = c.id_cliente;

SELECT * FROM clientes c LEFT JOIN pedidos p ON c.id_cliente = p.id_cliente;

La segunda se lee mejor porque el orden mental coincide con el orden escrito: empiezas por clientes y le pegas los pedidos. Por eso en equipos se suele acordar usar solo LEFT, y así todas las consultas se leen igual.

FULL OUTER JOIN y CROSS JOIN

FULL OUTER JOIN trae todo de las dos tablas. Su uso real no es reportar sino auditar: te muestra los pedidos sin cliente válido y los clientes sin pedidos en un solo resultado. Es lo primero que corro cuando una empresa me dice que sus números no cuadran.

CROSS JOIN combina cada fila con cada fila. Si tienes 10 productos y 12 meses, te devuelve 120 filas. Suena inútil hasta que necesitas una tabla con todas las combinaciones posibles para después rellenar con ventas y ver los meses donde un producto no vendió nada. Es la forma correcta de generar esos ceros que no existen en la data.

Cuidado con CROSS JOIN accidental: si escribes dos tablas separadas por coma y te olvidas el WHERE que las relaciona, SQL hace un CROSS JOIN sin avisar. Con dos tablas de mil filas cada una, eso es un millón de filas.

Unir tres o más tablas

Los JOIN se encadenan. Cada uno se apoya en lo que ya trajiste antes:

SELECT c.nombre, p.fecha, pr.descripcion, d.cantidad
FROM clientes c
INNER JOIN pedidos p    ON c.id_cliente = p.id_cliente
INNER JOIN detalle d    ON p.id_pedido = d.id_pedido
INNER JOIN productos pr ON d.id_producto = pr.id_producto;

Dos consejos que ahorran horas: usa alias cortos (c, p, d, pr) porque escribir el nombre completo de la tabla en cada columna vuelve la consulta ilegible. Y arma la consulta de a un JOIN por vez, ejecutando y mirando el resultado, en vez de escribir los cuatro y después adivinar cuál rompió el conteo.

Los tres errores que hacen que salgan filas de más

  1. La columna de unión no es única. Si en la tabla de la derecha hay varias filas con el mismo id, cada fila de la izquierda se duplica una vez por cada coincidencia. Es la causa número uno de "mi total salió el doble".
  2. Filtrar la tabla derecha en el WHERE de un LEFT JOIN. Si escribes LEFT JOIN pedidos p ... WHERE p.estado = "pagado", el WHERE elimina las filas con NULL y tu LEFT JOIN se comporta como un INNER. La condición va en el ON, no en el WHERE.
  3. Olvidar el ON. Sin condición de unión terminas con un producto cartesiano: cada fila con cada fila.

Y una vez que dominas los JOIN, el siguiente paso natural son las funciones de ventana, que permiten rankear y comparar dentro de cada grupo sin perder el detalle.

El primero se detecta contando: corre SELECT COUNT(*) sobre tu tabla principal sola, y después sobre la consulta con JOIN. Si el número creció, tienes duplicados.

Preguntas frecuentes

¿Qué es un JOIN en SQL?

Es una operación que combina filas de dos o más tablas usando una columna que tienen en común. Se escribe con la palabra JOIN seguida de ON y la condición de unión, por ejemplo ON pedidos.id_cliente = clientes.id_cliente.

¿Cuál es la diferencia entre INNER JOIN y LEFT JOIN?

INNER JOIN devuelve solo las filas que tienen coincidencia en ambas tablas. LEFT JOIN devuelve todas las de la tabla izquierda, aunque no tengan pareja, rellenando con NULL. Si tienes 100 clientes y 70 compraron, INNER te da 70 y LEFT te da 100.

¿Cuántos tipos de JOIN existen?

Seis: INNER, LEFT, RIGHT, FULL OUTER, CROSS y SELF JOIN. En el trabajo real se usan sobre todo INNER y LEFT; RIGHT casi no se usa porque se prefiere invertir el orden de las tablas.

¿Qué hace un FULL OUTER JOIN?

Devuelve todas las filas de ambas tablas, coincidan o no, rellenando con NULL los lados sin pareja. Su uso más práctico es auditar: encontrar de una sola vez los registros huérfanos de los dos lados.

¿Por qué mi JOIN devuelve más filas de las esperadas?

Casi siempre porque la columna de unión no es única en la tabla derecha: cada fila de la izquierda se duplica una vez por cada coincidencia. Para confirmarlo, compara el COUNT de tu tabla principal sola contra el COUNT de la consulta con JOIN.

¿Se pueden unir más de dos tablas?

Sí, los JOIN se encadenan uno tras otro y cada uno puede apoyarse en lo que ya trajiste. Conviene usar alias cortos y armar la consulta agregando un JOIN por vez para detectar cuál rompe el conteo.

¿Qué es un SELF JOIN?

Es unir una tabla consigo misma usando dos alias distintos. Se usa para jerarquías: en una tabla de empleados donde cada fila tiene el id de su jefe, un SELF JOIN te permite mostrar el nombre del empleado junto al de su jefe.

SQL es la habilidad de datos que más piden y la más fácil de empezar

Leer tutoriales sueltos te deja con pedazos. En el curso de SQL + Python vas de cero a consultar bases reales con criterio: consultas, joins, agregaciones y modelado, con proyectos y datasets de verdad. En vivo. Para empresas, lo llevo a tu equipo.

Formate con Gera

¿Quieres aprender datos?

Cursos en vivo de SQL, Python y Power BI con Gera. Clases por Zoom, datos reales y feedback directo. Tambien hacemos capacitacion in-company.

Ver cursos de datos
joins en sql

Comparte este artículo:

Sigue a Miss Yera:
WhatsApp directo
¿Tienes alguna duda o consulta?