La cláusula OUTER JOIN en SQL se utiliza para combinar filas de dos tablas, devolviendo todas las coincidencias y, además, las filas que no tienen correspondencia en una de las tablas.
👉 Es diferente de INNER JOIN, que solo devuelve las coincidencias.
👉 Con OUTER JOIN podemos obtener datos incluso cuando faltan correspondencias, rellenando los valores con NULL.
Tipos de OUTER JOIN
Existen tres variantes principales:
- LEFT OUTER JOIN
Devuelve todas las filas de la tabla izquierda y las coincidentes de la derecha.
Si no hay coincidencia, completa conNULL. - RIGHT OUTER JOIN
Devuelve todas las filas de la tabla derecha y las coincidentes de la izquierda. - FULL OUTER JOIN
Devuelve todas las filas de ambas tablas, coincidan o no.
En la práctica, muchos motores permiten usar simplemente LEFT JOIN, RIGHT JOIN o FULL JOIN, omitiendo la palabra OUTER.
Sintaxis básica de OUTER JOIN
SELECT columnas
FROM tabla1
LEFT | RIGHT | FULL OUTER JOIN tabla2
ON tabla1.columna = tabla2.columna;
Ejemplo de LEFT OUTER JOIN
Tablas:
clientes
| id | nombre |
|---|---|
| 1 | Ana |
| 2 | Luis |
| 3 | Carla |
pedidos
| id | cliente_id | total |
|---|---|---|
| 1 | 1 | 100 |
| 2 | 2 | 200 |
Consulta:
SELECT c.id, c.nombre, p.total
FROM clientes c
LEFT OUTER JOIN pedidos p
ON c.id = p.cliente_id;
Resultado:
| id | nombre | total |
|---|---|---|
| 1 | Ana | 100 |
| 2 | Luis | 200 |
| 3 | Carla | NULL |
👉 Carla aparece aunque no tenga pedidos.
Ejemplo de RIGHT OUTER JOIN
SELECT c.id, c.nombre, p.total
FROM clientes c
RIGHT OUTER JOIN pedidos p
ON c.id = p.cliente_id;
Resultado:
| id | nombre | total |
|---|---|---|
| 1 | Ana | 100 |
| 2 | Luis | 200 |
👉 Muestra todos los pedidos, aunque el cliente no esté en la tabla clientes (si existiera ese caso).
Ejemplo de FULL OUTER JOIN
SELECT c.id, c.nombre, p.total
FROM clientes c
FULL OUTER JOIN pedidos p
ON c.id = p.cliente_id;
Resultado:
| id | nombre | total |
|---|---|---|
| 1 | Ana | 100 |
| 2 | Luis | 200 |
| 3 | Carla | NULL |
👉 Combina los dos anteriores: muestra todos los clientes y todos los pedidos.
OUTER JOIN vs INNER JOIN
- INNER JOIN: solo devuelve coincidencias.
- OUTER JOIN: devuelve coincidencias y filas sin correspondencia (con
NULL).
Si quieres repasar la sintaxis general, mira el artículo sobre JOIN en SQL.
Ejemplo comparativo:
-- INNER JOIN
SELECT c.nombre, p.total
FROM clientes c
INNER JOIN pedidos p ON c.id = p.cliente_id;
-- LEFT JOIN
SELECT c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id;
👉 El primero no devuelve clientes sin pedidos, el segundo sí.
OUTER JOIN con múltiples tablas
Podemos encadenar varios OUTER JOIN en combinación con condiciones adicionales en el WHERE.
SELECT c.nombre, p.total, f.metodo_pago
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
LEFT JOIN facturas f ON p.id = f.pedido_id;
👉 Devuelve clientes, sus pedidos y facturas (si existen).
OUTER JOIN y condiciones adicionales
Podemos filtrar resultados después del JOIN:
SELECT c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
WHERE p.total > 150;
⚠️ Ojo: este filtro elimina los NULL, por lo que ya no se verán clientes sin pedidos.
Para conservarlos, conviene mover la condición al ON:
SELECT c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p
ON c.id = p.cliente_id AND p.total > 150;
Rendimiento de OUTER JOIN
LEFT JOINsuele ser más eficiente queFULL OUTER JOIN.- Para grandes tablas, conviene tener índices en las columnas de unión.
FULL OUTER JOINno está disponible en MySQL; se simula conUNION.
Ejemplo en MySQL:
SELECT c.id, c.nombre, p.total
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
UNION
SELECT c.id, c.nombre, p.total
FROM clientes c
RIGHT JOIN pedidos p ON c.id = p.cliente_id;
Errores comunes con OUTER JOIN
- Olvidar el ON
👉 Sin condición, se genera un producto cartesiano (todas las combinaciones posibles). - Confundir filtros en WHERE vs ON
👉 Si se filtra enWHERE, losNULLdesaparecen. - Esperar que todos los motores soporten FULL OUTER JOIN
👉 MySQL no lo soporta. - Duplicados inesperados
👉 Si la condición de unión no es única, puede devolver más filas de las esperadas.
Buenas prácticas con OUTER JOIN
- Usar
LEFT JOINcuando la tabla izquierda sea la principal. - Filtrar condiciones de coincidencia dentro de
ONpara no eliminar filas conNULL. - Evitar
FULL OUTER JOINsalvo que sea realmente necesario. - Siempre indexar las columnas que se usan en el
ON. - Documentar claramente por qué se usa un OUTER JOIN (evita confusiones con INNER JOIN).
Preguntas frecuentes (FAQ)
1. ¿Qué diferencia hay entre LEFT JOIN y RIGHT JOIN?
La tabla “principal” cambia: LEFT asegura todas las filas de la izquierda, RIGHT todas las de la derecha.
2. ¿FULL OUTER JOIN está disponible en MySQL?
No. Debe simularse con UNION.
3. ¿Se pueden combinar INNER y OUTER JOIN en la misma consulta?
Sí, se pueden mezclar según lo que se necesite.
4. ¿OUTER JOIN afecta el rendimiento?
Sí, más que un INNER JOIN, ya que debe procesar filas no coincidentes.
5. ¿Los OUTER JOIN son parte del estándar SQL?
Sí, están incluidos en SQL estándar, aunque su implementación varía según el motor.
Conclusión
El OUTER JOIN en SQL es indispensable cuando queremos conservar filas sin coincidencia entre dos tablas.
LEFT OUTER JOIN: asegura las filas de la izquierda.RIGHT OUTER JOIN: asegura las filas de la derecha.FULL OUTER JOIN: asegura todas las filas de ambas.
Dominar los distintos tipos de OUTER JOIN es clave para consultas completas, reportes y análisis de datos reales.
Compara variantes LEFT/RIGHT/FULL en JOINS y vuelve al Glosario SQL completo.