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
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.
-- 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:
-- 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
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.
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
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.
Mostrar pista
No sirve ÚNETE a productos: cantidad y precio unitario sono già en order_items.
Solución disponible después de 3 intentos