Menu
CoddyTech

الاتحاد (Union)

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

تختلف عمليات الاتحاد عن عمليات الربط. تستخدم عمليات الربط الشروط لدمج الجداول، أما عمليات الاتحاد فتضيف جدولًا إلى آخر. لاستخدام UNION، سنكتب:

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

يجب أن يلتزم كلا استعلامي التحديد بالقواعد التالية:

  • يجب أن يكون عدد الأعمدة متساويًا
  • الترتيب مهم
  • يجب أن تحتوي الأعمدة في الموضع نفسه على النوع نفسه من البيانات (لا يتحقق SQLite من أنواعها)

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

germany_people

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

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

SELECT name from germany_people
UNION
SELECT name from england_people

النتيجة:

الاسم
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 مع الدوال التجميعية وGROUP BY وORDER BY لتلخيص البيانات عبر جداول متعددة. تكمن الحيلة في وضع UNION ALL داخل استعلام فرعي، ثم تطبيق التجميع والفرز عليه.

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

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

النتيجة:

الاسمtotal_count
Lena2
Leonie1
George1

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

challenge icon

التحدي

سهل

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

  • sales_2009: product_id, quantity_sold
  • sales_2010: product_id, quantity_sold
  • sales_2011: product_id, quantity_sold

هناك 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