JOIN en SQL: qué es, tipos y ejemplos prácticos

En SQL, un JOIN (unión) se utiliza para combinar filas de dos o más tablas en función de una relación entre ellas.
El objetivo es consultar información distribuida en diferentes tablas de una base de datos relacional.

👉 Sin JOIN, habría que trabajar con tablas aisladas. Con JOIN, se pueden relacionar clientes con pedidos, empleados con departamentos, ventas con productos, etc.

¿Qué es un JOIN en SQL?

Un JOIN establece una relación entre dos tablas basándose en una condición.
Generalmente, esa condición conecta una clave primaria en una tabla con una clave foránea en otra.

Ejemplo básico:

SELECT c.nombre, p.total
FROM clientes c
JOIN pedidos p
  ON c.id = p.cliente_id;

👉 Une las tablas clientes y pedidos mostrando nombre del cliente y total del pedido.

Tipos de JOIN en SQL

Existen varios tipos de JOIN. Los más comunes son:

  1. INNER JOIN
  2. LEFT JOIN (o LEFT OUTER JOIN)
  3. RIGHT JOIN (o RIGHT OUTER JOIN)
  4. FULL OUTER JOIN
  5. CROSS JOIN

Veamos cada uno en detalle.

1. INNER JOIN

Devuelve solo las filas que tienen coincidencias en ambas tablas.
Es el tipo de JOIN más usado.

SELECT c.nombre, p.total
FROM clientes c
INNER JOIN pedidos p
  ON c.id = p.cliente_id;

👉 Muestra clientes que tienen pedidos.
Clientes sin pedidos no aparecen en el resultado.

2. LEFT JOIN (LEFT OUTER JOIN)

Devuelve todas las filas de la tabla izquierda y las coincidencias de la tabla derecha.
Si no hay coincidencia, devuelve NULL en las columnas de la tabla derecha.

SELECT c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p
  ON c.id = p.cliente_id;

👉 Muestra todos los clientes, incluso los que no tienen pedidos (en ese caso, total será NULL).

3. RIGHT JOIN (RIGHT OUTER JOIN)

Es lo opuesto al LEFT JOIN:
Devuelve todas las filas de la tabla derecha y las coincidencias de la izquierda.

SELECT c.nombre, p.total
FROM clientes c
RIGHT JOIN pedidos p
  ON c.id = p.cliente_id;

👉 Muestra todos los pedidos, incluso aquellos cuyo cliente no exista (ej. registros huérfanos).

4. FULL JOIN (FULL OUTER JOIN)

Devuelve todas las filas de ambas tablas, coincidan o no.
Donde no hay coincidencia, coloca NULL.

SELECT c.nombre, p.total
FROM clientes c
FULL JOIN pedidos p
  ON c.id = p.cliente_id;

👉 Une las tablas mostrando coincidencias y también los registros que existen en una pero no en la otra.

Nota: MySQL no soporta FULL JOIN directamente. Puede simularse con UNION de LEFT JOIN y RIGHT JOIN.

5. CROSS JOIN

Devuelve el producto cartesiano: todas las combinaciones posibles entre filas de ambas tablas.

SELECT c.nombre, p.total
FROM clientes c
CROSS JOIN pedidos p;

👉 Si hay 10 clientes y 5 pedidos, el resultado tendrá 50 filas.
Suele usarse en casos muy específicos, como generar combinaciones.

Comparación visual de los tipos de JOIN

Tipo de JOINResultado
INNER JOINSolo filas con coincidencia en ambas tablas
LEFT JOINTodas las filas de la izquierda + coincidencias
RIGHT JOINTodas las filas de la derecha + coincidencias
FULL JOINTodas las filas de ambas tablas (coincidan o no)
CROSS JOINTodas las combinaciones posibles

Ejemplo con datos de prueba

Tablas:

clientes

idnombre
1Ana
2Luis
3Carla

pedidos

idcliente_idtotal
1012500
1023300
1034200

Resultados:

  • INNER JOIN → Luis (500), Carla (300).
  • LEFT JOIN → Ana (NULL), Luis (500), Carla (300).
  • RIGHT JOIN → Luis (500), Carla (300), NULL (200).
  • FULL JOIN → Ana (NULL), Luis (500), Carla (300), NULL (200).
  • CROSS JOIN → 3 clientes × 3 pedidos = 9 combinaciones.

JOINS múltiples

Podemos unir más de dos tablas:

SELECT c.nombre, p.id AS pedido, pr.nombre AS producto
FROM clientes c
JOIN pedidos p ON c.id = p.cliente_id
JOIN productos pr ON p.producto_id = pr.id;

👉 Une clientes, pedidos y productos en una sola consulta.

JOIN con condiciones adicionales

Además de la relación, se pueden aplicar filtros:

SELECT c.nombre, p.total
FROM clientes c
INNER JOIN pedidos p ON c.id = p.cliente_id
WHERE p.total > 300;

👉 Devuelve solo pedidos mayores a 300.

Errores comunes al usar JOIN

  1. Olvidar la condición ON
SELECT * FROM clientes JOIN pedidos;

👉 Esto genera un producto cartesiano (todas las combinaciones).

  1. Usar columnas equivocadas en la condición
    👉 Puede devolver resultados incorrectos o duplicados.
  2. Confundir LEFT JOIN con INNER JOIN
    👉 LEFT incluye filas sin coincidencias, INNER no.
  3. Duplicación de filas inesperadas
    👉 Normal si existe una relación de uno a muchos. Hay que agrupar o filtrar.

Buenas prácticas con JOIN

  • Usar alias cortos para tablas (c, p, pr).
  • Asegurar que las columnas de unión estén indexadas.
  • Especificar siempre la condición ON.
  • Evitar unir tablas innecesarias.
  • Revisar el plan de ejecución con EXPLAIN para optimizar.

JOINs en distintos motores

  • MySQL/MariaDB: soporta INNER, LEFT, RIGHT, CROSS. No soporta FULL JOIN directamente.
  • PostgreSQL: soporta todos los tipos de JOIN.
  • SQL Server: soporta INNER, LEFT, RIGHT, FULL.
  • Oracle: soporta INNER, LEFT, RIGHT, FULL y CROSS.

Preguntas frecuentes (FAQ)

1. ¿JOIN y INNER JOIN son lo mismo?
Sí. Si escribís solo JOIN, el motor lo interpreta como INNER JOIN.

2. ¿Qué pasa si no hay coincidencias en INNER JOIN?
No devuelve filas.

3. ¿FULL JOIN existe en MySQL?
No directamente. Se simula con LEFT JOIN UNION RIGHT JOIN.

4. ¿Se pueden hacer JOIN con más de dos tablas?
Sí, se pueden encadenar varios JOIN en la misma consulta.

5. ¿JOIN es lento en tablas grandes?
Puede serlo. Por eso es importante tener índices en las columnas de unión.

Conclusión

El uso de JOIN en SQL es fundamental para trabajar con bases de datos relacionales.
Cada tipo cumple un propósito distinto:

  • INNER JOIN: coincidencias.
  • LEFT JOIN: todo lo de la izquierda.
  • RIGHT JOIN: todo lo de la derecha.
  • FULL JOIN: todo lo de ambas.
  • CROSS JOIN: todas las combinaciones.

Dominar JOIN te permite combinar información y generar reportes completos, optimizados y profesionales.

Compara tipos de uniones y casos de uso en JOINS y consulta el Glosario SQL completo.

Scroll al inicio