
Si trabajas con bases de datos relacionales, hacer consultas a una sola tabla se queda corto muy rápido. La verdadera magia de SQL empieza cuando conectas la información de distintas tablas usando las cláusulas **JOIN**.
Sin embargo, para quienes se están iniciando en el desarrollo o la gestión de bases de datos, entender qué devuelve exactamente cada tipo de JOIN puede ser confuso.
En este artículo repasamos de forma muy clara los tipos de JOIN más utilizados, cómo funcionan y cuándo usar cada uno.
## 1. INNER JOIN: Solo las coincidencias
Es el JOIN por defecto y el más utilizado. Devuelve **únicamente las filas que tienen correspondencia en ambas tablas**. Si un registro de la Tabla A no encuentra coincidencia en la Tabla B (o viceversa), simplemente no aparecerá en el resultado.
* **Metáfora visual:** La intersección de un diagrama de Venn.
«`sql
SELECT empleados.nombre, departamentos.nombre_departamento
FROM empleados
INNER JOIN departamentos
ON empleados.departamento_id = departamentos.id;
«`
> **¿Cuándo usarlo?** Cuando solo te interesen los datos que existen en ambas entidades (por ejemplo, ver solo las facturas que pertenecen a usuarios activos).
>
## 2. LEFT JOIN (o LEFT OUTER JOIN): Todo lo de la izquierda
Devuelve **todos los registros de la tabla de la izquierda** (la primera en la consulta) y los registros coincidentes de la tabla de la derecha. Si no hay coincidencia en la tabla derecha, los campos de esta última aparecerán como NULL.
* **Metáfora visual:** Toda la circunferencia de la izquierda y el área donde se cruza con la derecha.
«`sql
SELECT clientes.nombre, pedidos.id_pedido
FROM clientes
LEFT JOIN pedidos
ON clientes.id = pedidos.cliente_id;
«`
> **¿Cuándo usarlo?** Cuando quieras conservar la lista completa de tu tabla principal, independientemente de si tienen datos asociados en la segunda (por ejemplo, listar todos los clientes y ver si han hecho algún pedido o no).
>
## 3. RIGHT JOIN (o RIGHT OUTER JOIN): Todo lo de la derecha
Es la imagen especular del LEFT JOIN. Devuelve **todos los registros de la tabla de la derecha** y las coincidencias de la izquierda. Si no hay coincidencia a la izquierda, mostrará NULL.
«`sql
SELECT empleados.nombre, departamentos.nombre_departamento
FROM empleados
RIGHT JOIN departamentos
ON empleados.departamento_id = departamentos.id;
«`
> **Nota práctica:** Aunque existe, la mayoría de desarrolladores prefiere reordenar las tablas y usar siempre LEFT JOIN para mantener las consultas más legibles de izquierda a derecha.
>
## 4. FULL JOIN (o FULL OUTER JOIN): Todo lo de ambas tablas
Devuelve **todos los registros cuando hay una coincidencia en cualquiera de las dos tablas**. Combina los resultados del LEFT JOIN y del RIGHT JOIN. Si no hay coincidencia en ninguno de los lados, se rellenará con NULL.
«`sql
SELECT estudiantes.nombre, cursos.nombre_curso
FROM estudiantes
FULL OUTER JOIN cursos
ON estudiantes.curso_id = cursos.id;
«`
> **¿Cuándo usarlo?** Ideal para auditorías o análisis de datos donde necesitas identificar inconsistencias en ambas direcciones (por ejemplo, estudiantes sin curso y cursos sin estudiantes).
>
## Casos especiales: CROSS JOIN y SELF JOIN
Para completar las herramientas de tu arsenal SQL:
* **CROSS JOIN:** Realiza un producto cartesiano. Combina cada fila de la primera tabla con cada una de las filas de la segunda.
* **SELF JOIN:** No es una cláusula distinta, sino la técnica de hacer un JOIN de una tabla **consigo misma** (útil para estructuras jerárquicas, como empleados y sus supervisores).
## Resumen rápido
| Tipo de JOIN | ¿Qué datos devuelve? |
|—|—|
| **INNER JOIN** | Solo los registros con coincidencia en **ambas** tablas. |
| **LEFT JOIN** | **Todos** los registros de la tabla izquierda + coincidencias de la derecha. |
| **RIGHT JOIN** | **Todos** los registros de la tabla derecha + coincidencias de la izquierda. |
| **FULL JOIN** | **Todos** los registros de ambas tablas, hayan coincidencias o no. |
| **CROSS JOIN** | Todas las combinaciones posibles (producto cartesiano). |
