الانتقال إلى المحتوى الرئيسي
الوحدة 5 · الدرس 1 من 417/57 في الدورة~12 min
دروس الوحدة (1/4)

الصلات على ثلاثة جداول أو أكثر

في الوحدة 3 قمت بربط جدولين. في بيانات العالم الحقيقي تقريبا منتشرة دائمًا عبر ثلاثة أو أكثر من الجداول المرتبطة بمفاتيح خارجية: to أجب عن سؤال عمل عليك اجتياز سلسلة العلاقات. هذا هو بالضبط ما يفعله الجدول المتعدد JOIN.

من هذه الوحدة فصاعدًا، سنستخدم مجموعة البيانات ecommerce (العملاء، الفئات، المنتجات، الطلبات، عناصر الطلب، المراجعات). يمكنك استكشافها من الملعب عن طريق تحديد ecommerce من مجموعة البيانات منتقي.

بناء الجملة: سلسلة من الصلات

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 …]
…;

يضيف كل JOIN "رابطًا" إلى السلسلة: يأخذ المحرك الوسيط نتيجة عمليات JOIN السابقة وإرفاق الجدول التالي بها.

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;

ثلاثة JOINs، أربعة جداول. تحتوي النتيجة على صف واحد لكل order_items — لكل منهما المنتج في كل طلب - غني بالبريد الإلكتروني للعميل واسم المنتج.

الترتيب المنطقي

يقوم المحرك بربط الجداول من اليسار إلى اليمين. يمكن لشرط JOIN أن قم بالرجوع إلى أي جدول تم تقديمه بالفعل أعلاه. لسهولة القراءة:

  • ضع "الجدول الرئيسي" للسؤال أولاً (هنا orders)؛
  • قم بإضافة الآخرين بالترتيب الذي قمت بزيارتهم به من خلال اتباع العلاقات.

المجاميع عبر سلاسل JOIN

يتم دمج JOINs المتعددة مع GROUP BY لإنتاج التقارير:

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;

لا تحتاج إلى JOIN products هنا: كل ما تحتاجه (quantity، unit_price) موجود بالفعل في order_items. القاعدة الأساسية: ** لا تضف الجداول لا تستخدمها** — فهي تضر بالأداء وسهولة القراءة.

جربه بنفسك

تمرين#sql.m5.l1.e1
المحاولات: 0جارٍ التحميل…

لكل طلب من الطلبات المرسلة (الحالة = "تم التسليم")، عرض البريد الإلكتروني للعميل، اسم المنتج والكمية. ثلاثة كولون. Ordina per id ordine crescente e id prodotto crescente.

جارٍ تحميل المحرر…
إظهار التلميح

ثلاث وصلات: الطلبات ← العملاء على معرف_الزبون، الطلبات ← عناصر_الطلب على معرّف_الطلب، عناصر_الطلب ← المنتجات على معرف_المنتج.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m5.l1.e2
المحاولات: 0جارٍ التحميل…

أعلى 3 عملاء لكل طلب إجماليًا (حجم الكمية * سعر_الوحدة) خاص بهم فقط. العمود المستحق: إجمالي البريد الإلكتروني. الترتيب لكل انخفاض إجمالي، الحد هو 3.

جارٍ تحميل المحرر…
إظهار التلميح

لا نخدم منتجات JOIN: الكمية وسعر الوحدة موجودان في الطلب_العناصر.

الحل متاح بعد 3 من المحاولات