joins-multiples-tablas

Joins de múltiples tablas en SQL

  • 3 min

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:

  1. Tomas la Tabla A.
  2. La unes con la Tabla B.
  3. 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;
Copied!

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;
Copied!

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:

  1. Queremos listar TODOS los clientes (LEFT JOIN Pedidos).
  2. 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;
Copied!

¿Qué pasa aquí?

  1. El LEFT JOIN funciona: Trae a “Juan” (que no tiene pedidos). P.EmpleadoID es NULL para Juan.
  2. Llega el INNER JOIN: Intenta unir ese NULL con la tabla de Empleados. Como NULL no 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;
Copied!

Si empiezas con LEFT JOIN, generalmente debes seguir con LEFT JOIN el resto de la cadena para mantener los nulos.