الاتحاد (Union)
جزء من قسم الأساسيات في رحلة SQL على Coddy. الدرس 48 من 72.
تختلف عمليات الاتحاد عن عمليات الربط. تستخدم عمليات الربط الشروط لدمج الجداول، أما عمليات الاتحاد فتضيف جدولًا إلى آخر. لاستخدام UNION، سنكتب:
SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2يجب أن يلتزم كلا استعلامي التحديد بالقواعد التالية:
- يجب أن يكون عدد الأعمدة متساويًا
- الترتيب مهم
- يجب أن تحتوي الأعمدة في الموضع نفسه على النوع نفسه من البيانات (لا يتحقق SQLite من أنواعها)
على سبيل المثال، لنفترض أن لدينا الجداول التالية:
germany_people
| id | name |
| 1 | Lena |
| 2 | Leonie |
england_people
| id | name |
| 1 | George |
| 2 | Lena |
المشكلة: نريد إنشاء جدول كبير واحد يضم جميع الأسماء التي لدينا.
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 |
| Lena | 2 |
| Leonie | 1 |
| George | 1 |
هنا، يُستخدم UNION ALL (وليس UNION) للاحتفاظ بالتكرارات مثل Lena. وإلا فستُزال قبل العدّ. يجمع الاستعلام الفرعي كل الصفوف، ثم يلخّصها GROUP BY + COUNT. ويرتّب ORDER BY النتيجة النهائية.
التحدي
سهلالجداول والأعمدة المتاحة:
sales_2009:product_id,quantity_soldsales_2010:product_id,quantity_soldsales_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;يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
2الشروط
أساسيات الشروطالكلمة المفتاحية ANDالكلمة المفتاحية ORالكلمة المفتاحية NOTدمج شروط متعددةالأقواسالقيم المنطقية Booleans3تنسيق محدد للنتائج
قيم Nullترتيب النتائج - الجزء الأولترتيب النتائج - الجزء الثانيمراجعة - شركة للأمن السيبرانيتحديد عدد السجلاتمراجعة - مصنع مركبات6تحديات تمهيدية
مراجعة - الانتخابات البرلمانيةمراجعة - اعتقال الشرطة للمجرمينمراجعة - حاوية مشروبات البارمراجعة - هندسة أعمدة جديدة9جداول متعددة
الربط الأساسي - الجزء الأولالربط الأساسي - الجزء الثانيمراجعة - الربط (Join)الربط الذاتي (Self Join)مراجعة - الربط الذاتي (Self Join)الاتحاد (Union)تبسيط الاستعلامات، الكلمة المفتاحية WITHمراجعة - استعلامات WITHمراجعة - مقاول العقارات12Window Functions الجزء الثاني
دوال RANK و DENSE_RANKمراجعة - RANK و DENSE_RANKدالة NTILEدوال التجميعمعيار ROWS و RANGEتدرّب بنفسك: Playground لـ SQL