La cláusulas JOIN permite concatenar múltiples tablas para combinar información distribuida en tres, cuatro o más tablas relacionales dentro de una única consulta.
Hasta ahora hemos visto cómo casar a los Clientes con sus Pedidos. Pero el mundo real es más complejo.
Tu no quieres saber solo el ID del pedido; quieres saber el Nombre del Producto, la Categoría a la que pertenece y el Empleado que lo vendió. Esos datos viven en 4 o 5 tablas diferentes. ¿Cómo las unimos todas?
La buena noticia es que SQL no tiene límite (teórico) de cuántas tablas puedes unir. La sintaxis es simplemente una cadena.
La cadena básica
Imagina un tren. El primer vagón se engancha al segundo. El segundo se engancha al tercero. El primero no toca al tercero directamente, están unidos a través del segundo.
En SQL es igual:
- Tomas la Tabla A.
- La unes con la Tabla B.
- El resultado de (A + B) se une con la Tabla C.
SELECT
Clientes.Nombre AS Cliente,
Pedidos.Fecha AS FechaPedido,
Empleados.Nombre AS Vendedor
FROM Clientes -- Vagón 1
INNER JOIN Pedidos -- Vagón 2 (Se une al 1)
ON Clientes.ClienteID = Pedidos.ClienteID
INNER JOIN Empleados -- Vagón 3 (Se une al 2)
ON Pedidos.EmpleadoID = Empleados.EmpleadoID;
Fíjate que en el segundo ON, unimos Pedidos con Empleados.
Clientes ya no pinta nada ahí, su trabajo terminó en el primer enganche.
Relaciones Muchos a Muchos
Este es el caso muy frecuente para los joins múltiples. Imagina Estudiantes y Asignaturas.
- Un estudiante se apunta a muchas asignaturas.
- Una asignatura tiene muchos estudiantes.
En bases de datos, no podemos unir estas dos tablas directamente. Necesitamos una Tabla Intermedia (o tabla puente/pivote), llamémosla Matriculas.
Para saber “Qué asignaturas estudia Ana”, tenemos que cruzar 3 tablas: Estudiantes -> Matriculas -> Asignaturas.
SELECT
Estudiantes.Nombre AS Estudiante,
Asignaturas.Nombre AS Asignatura
FROM Estudiantes
INNER JOIN Matriculas -- El Puente
ON Estudiantes.EstudianteID = Matriculas.EstudianteID
INNER JOIN Asignaturas -- El Destino
ON Matriculas.AsignaturaID = Asignaturas.AsignaturaID;
Si olvidas la tabla intermedia e intentas unir Estudiantes con Asignaturas directamente… descubrirás que no tienes ninguna columna en común (ON ... ???) para hacer el cruce.
El peligro de mezclar INNER y LEFT
El orden de los factores en SQL sí altera el producto cuando mezclas tipos de Joins.
Imagina este escenario:
- Queremos listar TODOS los clientes (LEFT JOIN Pedidos).
- Y queremos ver el nombre del vendedor del pedido (INNER JOIN Empleados).
La ❌ FORMA INCORRECTA (Rompe el LEFT JOIN)
SELECT Clientes.Nombre, Pedidos.PedidoID, Empleados.Nombre
FROM Clientes
LEFT JOIN Pedidos ON Clientes.ClienteID = Pedidos.ClienteID
INNER JOIN Empleados ON Pedidos.EmpleadoID = Empleados.EmpleadoID;
¿Qué pasa aquí?
- El
LEFT JOINfunciona: Trae a “Juan” (que no tiene pedidos).P.EmpleadoIDesNULLpara Juan. - Llega el
INNER JOIN: Intenta unir eseNULLcon la tabla de Empleados. ComoNULLno es igual a ningún ID de empleado, la fila de Juan se elimina.
Al añadir el último INNER JOIN, has convertido implícitamente tu LEFT JOIN anterior en un INNER JOIN. Has perdido a los clientes sin compras.
La ✅ forma correcta (Mantiene la cadena de nulos)
SELECT Clientes.Nombre, Pedidos.PedidoID, Empleados.Nombre
FROM Clientes
LEFT JOIN Pedidos ON Clientes.ClienteID = Pedidos.ClienteID
LEFT JOIN Empleados ON Pedidos.EmpleadoID = Empleados.EmpleadoID;
Si empiezas con LEFT JOIN, generalmente debes seguir con LEFT JOIN el resto de la cadena para mantener los nulos.
