Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الاتحاد (Union)

جزء من قسم الأساسيات في رحلة SQL على Coddy. الدرس 48 من 72.

تختلف عمليات الاتحاد (Unions) عن عمليات الربط (Joins). تعمل الربط (Joins) على استخدام شروط لدمج الجداول، لكن الاتحاد (unions) يكتفي بإضافة جدول فوق الآخر. لاستخدام UNION سنكتب:

SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2

يجب أن يخضع كلا الاستعلامين SELECT للقواعد التالية:

  • يجب أن يكون عدد الحقول متساويًا
  • الترتيب مهم جداً
  • يجب أن تتطابق الأعمدة الموجودة في نفس الموضع من حيث أنواع البيانات

على سبيل المثال، لنفترض أن لدينا الجداول التالية:

germany_people

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

المشكلة: نريد إنشاء جدول واحد كبير يضم جميع الأسماء التي لدينا.

SELECT name from germany_people
UNION
SELECT name from england_people

النتيجة:

name
Lena
Leonie
George

يعيد UNION القيم المميزة فقط بينما يعيد UNION ALL جميع السجلات كما هي:

SELECT name from germany_people
UNION ALL
SELECT name from england_people

النتيجة:

name
Lena
Leonie
George
Lena

يمكنك أيضًا دمج UNION ALL مع الدوال التجميعية (aggregate functions)، و GROUP BY، و ORDER BY لتلخيص البيانات عبر عدة جداول. الفكرة هي تغليف UNION ALL داخل استعلام فرعي (subquery)، ثم تطبيق التجميع والترتيب عليه.

على سبيل المثال، لنفترض أننا نريد حساب عدد مرات ظهور كل اسم عبر كلا الجدولين:

SELECT name, COUNT(*) AS total_count
FROM (
    SELECT name FROM germany_people
    UNION ALL
    SELECT name FROM england_people
) AS combined
GROUP BY name
ORDER BY total_count DESC

النتيجة:

nametotal_count
Lena2
Leonie1
George1

هنا، يتم استخدام UNION ALL (وليس UNION) للتحفظ على النسخ المكررة مثل Lena — وإلا فسيتم إزالتها قبل الحساب. الاستعلام الفرعي يدمج جميع الصفوف، ومن ثم GROUP BY + COUNT يلقمان بتلخيصها. يقوم ORDER BY بفرز الـ result النهائي.

challenge icon

التحدي

سهل

الجداول والأعمدة المتاحة:

  • <strong>sales_2009</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>
  • <strong>sales_2010</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>
  • <strong>sales_2011</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>

توجد 3 جداول مبيعات.

أوجد مجموع المبيعات لكل منتج من جميع الجداول معاً.

يجب أن تتضمن النتيجة product_id وإجمالي المبيعات.

سمِّ هذا العمود total_sales.

قم بفرز النتائج حسب إجمالي المبيعات تنازلياً.

جرّب بنفسك

-- كدّس الجداول الثلاثة في نتيجة واحدة، مع الاحتفاظ بكل صف
SELECT product_id, ____ AS total_sales
FROM (
    SELECT * FROM sales_2009
    ____
    SELECT * FROM sales_2010
    ____
    SELECT * FROM sales_2011
)
-- صف واحد لكل منتج، بأكبر إجمالي أولاً
GROUP BY ____
ORDER BY ____ DESC;
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات

تدرّب بنفسك: Playground لـ SQL