IOKELU
Nivel: Avanzado
💡 Prueba los JOIN avanzados:
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.

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

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

12. Preguntas frecuentes

¿FULL JOIN es lento?

Sí, especialmente en tablas grandes.

¿CROSS JOIN es útil?

Sí, para generar combinaciones.


Siguiente guía

SQL Avanzado – Agregación avanzada →