Saltar al contenido principal
eLearner.app
Módulo 5 · Lección 1 de 417/57 en el curso~12 min
Lecciones del módulo (1/4)

JOINs en tres o más tablas

En el Módulo 3 uniste dos tablas. En el mundo real, los datos son casi siempre dispersos en tres o más tablas vinculadas por claves externas: para Para responder a una pregunta de negocios hay que recorrer la cadena de relaciones. Eso es exactamente lo que hace un JOIN de múltiples tablas.

A partir de este módulo usaremos el conjunto de datos ecommerce (clientes, categorías, productos, pedidos, artículos de pedido, reseñas). Puedes explorarlo desde el Playground seleccionando ecommerce del conjunto de datos recolector.

La sintaxis: una cadena de JOIN

SQL
SELECT colonne
FROM   tabella_a
JOIN   tabella_b ON tabella_a.x = tabella_b.y
JOIN   tabella_c ON tabella_b.z = tabella_c.w
[JOIN  tabella_d ON …]
…;

Cada JOIN añade un "eslabón" a la cadena: el motor toma el intermedio resultado de los JOIN anteriores y le adjunta la siguiente tabla.

SQL
-- Per ogni riga d'ordine: cliente, prodotto e quantità.
SELECT c.email,
       p.name AS prodotto,
       oi.quantity
FROM   orders      AS o
JOIN   customers   AS c  ON o.customer_id = c.id
JOIN   order_items AS oi ON oi.order_id   = o.id
JOIN   products    AS p  ON oi.product_id = p.id;

Tres JOIN, cuatro tablas. El resultado tiene una fila por order_items, cada una producto en cada pedido, enriquecido con el correo electrónico del cliente y el nombre del producto.

El orden lógico

El motor une tablas de izquierda a derecha. Una condición JOIN puede haga referencia a cualquier tabla ya presentada anteriormente. Para facilitar la lectura:

  • poner primero la "tabla principal" de la pregunta (aquí orders);
  • agregue los demás en el orden en que los visite siguiendo el relaciones.

Agregados sobre cadenas JOIN

Los JOIN múltiples se combinan con GROUP BY para producir informes:

SQL
-- Spesa totale per cliente (solo ordini consegnati):
SELECT c.email,
       SUM(oi.quantity * oi.unit_price) AS total
FROM   customers   AS c
JOIN   orders      AS o  ON o.customer_id = c.id
JOIN   order_items AS oi ON oi.order_id   = o.id
WHERE  o.status = 'delivered'
GROUP BY c.email
ORDER BY total DESC;

Aquí no necesitas JOIN products: todo lo que necesitas (quantity, unit_price) ya está en order_items. Regla general: no agregue tablas no usas: dañan el rendimiento y la legibilidad.

Pruébalo tú mismo

Ejercicio#sql.m5.l1.e1
Intentos: 0Cargando...

Per ogni riga d'ordine degli ordini consegnati (estado = 'entregado'), muestra el correo electrónico del cliente, el nombre del producto y la cantidad. Tres columnas. Ordina per id ordine crescente e id prodotto crescente.

Cargando editor...
Mostrar pista

Tres JOIN: pedidos → clientes en customer_id, pedidos → pedidos_artículos en order_id, pedidos_artículos → productos en product_id.

Solución disponible después de 3 intentos

Ejercicio de revisión

Ejercicio#sql.m5.l1.e2
Intentos: 0Cargando...

Los 3 principales clientes por venta total (como cantidad de cantidad * precio_unitario) son sus únicos pedidos consegnati. Columna debida: correo electrónico y total. Ordina per total decrescente, limita a 3.

Cargando editor...
Mostrar pista

No sirve ÚNETE a productos: cantidad y precio unitario sono già en order_items.

Solución disponible después de 3 intentos