دروس الوحدة (4/4)
اتحاد، تقاطع، باستثناء (وCROSS JOIN)
لقد قمت حتى الآن بدمج البيانات أفقيًا: JOIN إرفاق الأعمدة
من الصفوف ذات الصلة. تقدم SQL أيضًا عائلة أخرى من المشغلين
يجمع البيانات عموديًا، ويتعامل مع نتائج SELECTs على أنها
المجموعات: UNION، INTERSECT، EXCEPT. نعيد أيضًا زيارة CROSS JOIN،
المنتج الديكارتي.
CROSS JOIN: كل صف بكل صف
CROSS JOIN لا يحتوي على ON: فهو ينتج كل مجموعة ممكنة من
الصفوف بين جدولين (المنتج الديكارتي). إذا كان A يحتوي على n صفوف وB
يحتوي على صفوف m، والنتيجة لها n × m.
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM customers c
CROSS JOIN products p;12 عميل × 16 منتج = 192 صف. نادرًا ما يتم استخدامه في البيانات الحقيقية (إنه باهظة الثمن!) ولكنها مفيدة لـ:
- إنشاء مجموعات "الكل ضد الكل" (مثل مصفوفة التوافق)؛
- إقران الجدول بجدول صغير من الثوابت/المعلمات.
الاتحاد والاتحاد ALL
يُلحق UNION نتائج SELECTs بـ ** نفس الرقم و
نوع الأعمدة**:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';قواعد:
- يجب أن يحتوي الاثنان
SELECTs على نفس عدد الأعمدة، مع توافق أنواع؛ UNION(بدونALL) يزيل التكرارات — يؤدي بشكل فعالDISTINCTعلى النتيجة النهائية؛UNION ALLيحتفظ بالنسخ المكررة أيضًا، وهو أسرع بكثير لأنه يتجنب الفرز/التجزئة لإلغاء البيانات المكررة.
-- 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
"الفرق").
-- 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 لا تفعل ذلك.
جربه بنفسك
يمكنك العثور على جميع رسائل البريد الإلكتروني الخاصة بالعميل التي قمت بتنسيقها مثل OPPURE Recensito qualcosa (بدون نسخ مكررة). عمود واحد: البريد الإلكتروني. الترتيب لكل بريد إلكتروني.
إظهار التلميح
UNION بين تحديدين يعرضان نفس عمود البريد الإلكتروني. يتم تنفيذ الأمر ORDER BY في النهاية، على النتيجة النهائية.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
يمكنك العثور على البريد الإلكتروني الخاص بالعميل الذي لم يقم بتنسيقه ولكن لم يعد هناك أي تقييم له. الولايات المتحدة الأمريكية باستثناء. عمود واحد: البريد الإلكتروني. الترتيب لكل بريد إلكتروني.
إظهار التلميح
باستثناء يحتفظ فقط بالصفوف من التحديد الأيسر غير الموجودة في الصف الأيمن.
الحل متاح بعد 3 من المحاولات