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

اتحاد، تقاطع، باستثناء (وCROSS JOIN)

لقد قمت حتى الآن بدمج البيانات أفقيًا: JOIN إرفاق الأعمدة من الصفوف ذات الصلة. تقدم SQL أيضًا عائلة أخرى من المشغلين يجمع البيانات عموديًا، ويتعامل مع نتائج SELECTs على أنها المجموعات: UNION، INTERSECT، EXCEPT. نعيد أيضًا زيارة CROSS JOIN، المنتج الديكارتي.

CROSS JOIN: كل صف بكل صف

CROSS JOIN لا يحتوي على ON: فهو ينتج كل مجموعة ممكنة من الصفوف بين جدولين (المنتج الديكارتي). إذا كان A يحتوي على n صفوف وB يحتوي على صفوف m، والنتيجة لها n × m.

SQL
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM   customers c
CROSS JOIN products p;

12 عميل × 16 منتج = 192 صف. نادرًا ما يتم استخدامه في البيانات الحقيقية (إنه باهظة الثمن!) ولكنها مفيدة لـ:

  • إنشاء مجموعات "الكل ضد الكل" (مثل مصفوفة التوافق)؛
  • إقران الجدول بجدول صغير من الثوابت/المعلمات.

الاتحاد والاتحاد ALL

يُلحق UNION نتائج SELECTs بـ ** نفس الرقم و نوع الأعمدة**:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

قواعد:

  • يجب أن يحتوي الاثنان SELECTs على نفس عدد الأعمدة، مع توافق أنواع؛
  • UNION (بدون ALL) يزيل التكرارات — يؤدي بشكل فعال DISTINCT على النتيجة النهائية؛
  • UNION ALL يحتفظ بالنسخ المكررة أيضًا، وهو أسرع بكثير لأنه يتجنب الفرز/التجزئة لإلغاء البيانات المكررة.
SQL
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM   customers c JOIN orders  o ON o.customer_id = c.id
UNION
SELECT c.email
FROM   customers c JOIN reviews r ON r.customer_id = c.id;

تتقاطع وما عدا

INTERSECT يحتفظ بـ الصفوف الموجودة في كلتا النتيجتين فقط؛ محمي_INLINE_18 يحتفظ ** بصفوف الأول غير الموجودة في الثاني ** (set "الفرق").

SQL
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

يقوم INTERSECT وEXCEPT أيضًا بإزالة التكرارات بشكل افتراضي؛ ال المتغيرات INTERSECT ALL / EXCEPT ALL لا تفعل ذلك.

جربه بنفسك

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

يمكنك العثور على جميع رسائل البريد الإلكتروني الخاصة بالعميل التي قمت بتنسيقها مثل OPPURE Recensito qualcosa (بدون نسخ مكررة). عمود واحد: البريد الإلكتروني. الترتيب لكل بريد إلكتروني.

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

UNION بين تحديدين يعرضان نفس عمود البريد الإلكتروني. يتم تنفيذ الأمر ORDER BY في النهاية، على النتيجة النهائية.

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

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

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

يمكنك العثور على البريد الإلكتروني الخاص بالعميل الذي لم يقم بتنسيقه ولكن لم يعد هناك أي تقييم له. الولايات المتحدة الأمريكية باستثناء. عمود واحد: البريد الإلكتروني. الترتيب لكل بريد إلكتروني.

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

باستثناء يحتفظ فقط بالصفوف من التحديد الأيسر غير الموجودة في الصف الأيمن.

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