Puedes ejecutar cualquier JOIN complejo en nuestra consola interactiva: Abrir consola SQL →
Joins complejos en SQL: domina combinaciones avanzadas de datos
Los JOIN avanzados permiten combinar datos de múltiples tablas con precisión. Aquí aprenderás técnicas profesionales: FULL JOIN, CROSS JOIN, SELF JOIN, JOIN con condiciones múltiples y JOIN con funciones ventana.
Tabla de contenidos
1. FULL JOIN
SELECT *
FROM clientes
FULL JOIN pedidos ON clientes.id = pedidos.cliente_id;
Combina todas las filas de ambas tablas, incluso si no coinciden.
2. CROSS JOIN
SELECT *
FROM colores
CROSS JOIN tallas;
Genera el producto cartesiano: todas las combinaciones posibles.
3. SELF JOIN
SELECT e1.nombre AS empleado, e2.nombre AS jefe
FROM empleados e1
JOIN empleados e2 ON e1.jefe_id = e2.id;
Útil para jerarquías y relaciones dentro de la misma tabla.
4. JOIN con múltiples condiciones
SELECT *
FROM pedidos p
JOIN productos pr
ON p.producto_id = pr.id
AND pr.activo = TRUE
AND p.fecha > '2024-01-01';
5. JOIN + Window Functions
SELECT c.nombre, p.producto,
RANK() OVER(PARTITION BY c.nombre ORDER BY p.fecha DESC) AS ranking
FROM clientes c
JOIN pedidos p ON c.id = p.cliente_id;
6. ANTI JOIN (NOT EXISTS)
SELECT *
FROM clientes c
WHERE NOT EXISTS (
SELECT 1 FROM pedidos p WHERE p.cliente_id = c.id
);
7. SEMI JOIN (EXISTS)
SELECT *
FROM clientes c
WHERE EXISTS (
SELECT 1 FROM pedidos p WHERE p.cliente_id = c.id
);
8. Ejemplos prácticos
-- Productos sin ventas
SELECT pr.*
FROM productos pr
WHERE NOT EXISTS (
SELECT 1 FROM ventas v WHERE v.producto_id = pr.id
);
-- Clientes con más de 3 pedidos
SELECT c.nombre
FROM clientes c
WHERE EXISTS (
SELECT 1 FROM pedidos p WHERE p.cliente_id = c.id
GROUP BY p.cliente_id
HAVING COUNT(*) > 3
);
-- Combinación de tallas y colores
SELECT *
FROM tallas
CROSS JOIN colores;
9. Ejercicios para practicar
- Haz un FULL JOIN entre clientes y pedidos.
- Haz un CROSS JOIN entre tallas y colores.
- Haz un SELF JOIN para mostrar empleados y jefes.
- Haz un ANTI JOIN para ver productos sin ventas.
- Explica la diferencia entre EXISTS y NOT EXISTS.
SELECT *
FROM clientes
FULL JOIN pedidos ON clientes.id = pedidos.cliente_id;
SELECT *
FROM tallas
CROSS JOIN colores;
SELECT e1.nombre, e2.nombre
FROM empleados e1
JOIN empleados e2 ON e1.jefe_id = e2.id;
SELECT *
FROM productos pr
WHERE NOT EXISTS (
SELECT 1 FROM ventas v WHERE v.producto_id = pr.id
);
-- EXISTS busca coincidencias; NOT EXISTS busca ausencia de coincidencias.
10. Mini‑proyecto: Sistema de análisis de ventas
SELECT c.nombre, pr.nombre AS producto, SUM(v.cantidad) AS total
FROM clientes c
JOIN ventas v ON c.id = v.cliente_id
JOIN productos pr ON pr.id = v.producto_id
GROUP BY c.nombre, pr.nombre
ORDER BY total DESC;
11. Errores comunes
- Usar CROSS JOIN sin entender el producto cartesiano.
- Confundir SELF JOIN con CTE recursivas.
- No indexar columnas usadas en JOIN.
- Abusar de FULL JOIN sin necesidad.
12. Preguntas frecuentes
¿FULL JOIN es lento?
Sí, especialmente en tablas grandes.
¿CROSS JOIN es útil?
Sí, para generar combinaciones.