عمليات المجموعات
عمليات المجموعات
🌍 تشبيه من العالم الحقيقي
تخيّل أن لديك بطاقتين عمل:
- UNION — ادمج الرزمتين، مع الاحتفاظ بنسخة واحدة فقط من المكررات
- UNION ALL — ادمج جميع البطاقات من الرزمتين، مع الاحتفاظ بالمكررات
- INTERSECT — اختر فقط those الذين يظهرون في الرزمتين
- EXCEPT — أزل من الرزمة الأولى anyone يظهر أيضًا في الرزمة الثانية
عمليات المجموعات تُجري عمليات "دمج وتقاطع وفرق" على مجموعتي نتائج استعلام.
🎯 المفاهيم الأساسية
UNION — دمج مع إزالة التكرارات
يدمج مجموعتي نتائج، مع إزالة الصفوف المكررة تلقائيًا.
SELECT city FROM employees
UNION
SELECT city FROM departments;
UNION ALL — دمج بدون إزالة التكرارات
يدمج مجموعتي نتائج، مع الاحتفاظ بجميع الصفوف المكررة. أفضل أداءً لأنه لا يحتاج إلى إزالة التكرارات.
SELECT city FROM employees
UNION ALL
SELECT city FROM departments;
INTERSECT — تقاطع
يُرجع الصفوف التي توجد في كلا المجموعتين.
SELECT city FROM employees
INTERSECT
SELECT city FROM departments;
EXCEPT / MINUS — فرق
يُرجع الصفوف الموجودة في مجموعة النتائج الأولى لكن غير الموجودة في الثانية.
-- EXCEPT (SQL Server, PostgreSQL)
SELECT city FROM employees
EXCEPT
SELECT city FROM departments;
-- MINUS (Oracle)
SELECT city FROM employees
MINUS
SELECT city FROM departments;
قواعد مطابقة الأعمدة
عند استخدام عمليات المجموعات، يجب أن تفي بيانا SELECT بالشروط التالية:
| القاعدة | الوصف |
|---|---|
| نفس عدد الأعمدة | يجب أن يحتوي كلا SELECT على نفس عدد الأعمدة |
| أنواع متوافقة | يجب أن تكون الأعمدة المقابلة بأنواع بيانات متوافقة |
| ORDER BY في النهاية | يمكن استخدامه مرة واحدة فقط في نهاية البيان تمامًا |
-- صحيح: عمودان، الأنواع متطابقة
SELECT first_name, salary FROM employees
UNION
SELECT department_name, budget FROM departments;
-- خاطئ: عدد أعمدة مختلف
SELECT first_name, salary FROM employees
UNION
SELECT department_name; -- ❌ عدم تطابق عدد الأعمدة
💡 متى تستخدم أي عملية
| العملية | السيناريو | إزالة التكرارات | الأداء |
|---|---|---|---|
| UNION | تحتاج إلى دمج وإزالة التكرارات | ✅ نعم | أبطأ |
| UNION ALL | دمج بدون إزالة التكرارات | ❌ لا | أسرع |
| INTERSECT | العثور على الأجزاء المشتركة | ✅ نعم | متوسط |
| EXCEPT | العثور على الاختلافات | ✅ نعم | متوسط |
UNION ALL لأفضل أداء.
📝 الصيغة الأساسية
-- صيغة UNION
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2
[ORDER BY column1];
-- صيغة UNION ALL
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
-- صيغة INTERSECT
SELECT column1, column2 FROM table1
INTERSECT
SELECT column1, column2 FROM table2;
-- صيغة EXCEPT
SELECT column1, column2 FROM table1
EXCEPT
SELECT column1, column2 FROM table2;
- في عمليات المجموعات، أسماء الأعمدة يُحددها SELECT الأول
- ORDER BY يمكن أن يظهر فقط في النهاية وعادةً يستخدم أرقام الأعمدة الترتيبية
- كل SELECT يمكن أن يحتوي على WHERE وGROUP BY الخاص به
📌 أمثلة
مثال: استعلام عن جميع مصادر الأسماء
دمج أسماء الموظفين وأسماء الأقسام في مجموعة نتائج واحدة.
-- عرض جميع مصادر "الاسم": موظفين + مديري الأقسام
SELECT first_name AS name, 'Employee' AS source
FROM employees
UNION ALL
SELECT department_name, 'Department'
FROM departments
ORDER BY source;
الشرح: تمت إضافة عمود ثابت لتمييز مصدر البيانات لسهولة التمييز.
مثال: العثور على مدن بها موظفين لكن بدون أقسام
-- مدن بها موظفين ناقص مدن بها أقسام
SELECT city FROM employees
EXCEPT
SELECT city FROM departments;
النهج: استخدم EXCEPT كعملية فرق للعثور بسرعة على "المدن التي تظهر فقط في الموظفين."
🎬 سيناريوهات عملية
السيناريو 1: دمج قوائم عملاء متعددة القنوات
الشركة لديها جداول عملاء عبر الإنترنت وخارج الإنترنت تحتاج إلى دمجها وإزالة تكراراتها لإنشاء دليل عملاء كامل.
-- عملاء عبر الإنترنت
SELECT customer_name, email, 'Online' AS channel
FROM online_customers
UNION
-- عملاء خارج الإنترنت
SELECT customer_name, email, 'Offline'
FROM offline_customers
ORDER BY customer_name;
النقطة الرئيسية: استخدم UNION بدلاً من UNION ALL لإزالة العملاء المكررين تلقائيًا.
السيناريو 2: مقارنة اختلافات المبيعات بين شهرين
العثور على منتجات تم بيعها هذا الشهر لكن ليس الشهر الماضي.
-- المنتجات المباعة هذا الشهر
SELECT product_id FROM orders
WHERE order_date >= '2026-06-01'
EXCEPT
-- المنتجات المباعة الشهر الماضي
SELECT product_id FROM orders
WHERE order_date >= '2026-05-01'
AND order_date < '2026-06-01';
النقطة الرئيسية: EXCEPT مناسب بشكل طبيعي لسيناريوهات "العثور على الاختلافات".
❓ أسئلة شائعة
س: متى يجب استخدام UNION مقابل UNION ALL؟ ج: إذا كنت لا تحتاج إلى إزالة التكرارات، فضّل
UNION ALLلأنه لا يتطلب خطوة إزالة تكرارات إضافية وأداؤه أفضل. استخدمUNIONفقط عندما تحتاج تحديدًا إلى إزالة التكرارات.
س: هل عدم تطابق أسماء الأعمدة في عمليات المجموعات يسبب أخطاء؟ ج: لا، أسماء أعمدة مجموعة النتائج يُحددها
SELECTالأول. ومع ذلك، يجب أن يتطابق عدد الأعمدة وأنواع بيانات الأعمدة المقابلة.
س: ما الفرق بين INTERSECT وJOIN؟ ج:
INTERSECTيطابق الصفوف الكاملة للتقاطع، بينماJOINيربط الجداول بناءً على شروط محددة. استخدمINTERSECTعندما تحتاج إلى "العثور على صفوف متطابقة"، واستخدمJOINعندما تحتاج إلى "ربط أعمدة من جداول مختلفة حقل".
س: هل MySQL يدعم INTERSECT وEXCEPT؟ ج: MySQL 8.0 وما بعد يدعم
INTERSECTوEXCEPT. للإصدارات الأقدم، تحتاج إلى محاكاتها باستخدامINNER JOINوNOT EXISTS/LEFT JOIN ... IS NULL.
📖 ملخص
| العملية | الغرض | إزالة التكرارات |
|---|---|---|
| UNION | دمج مجموعتي نتائج | ✅ |
| UNION ALL | دمج مجموعتي نتائج (احتفاظ بالمكررات) | ❌ |
| INTERSECT | تقاطع مجموعتي نتائج | ✅ |
| EXCEPT | فرق مجموعتي نتائج | ✅ |
- يجب أن يتطابق عدد الأعمدة وأنواعها
ORDER BYيمكن وضعه فقط في نهاية البيان- فضّل
UNION ALLعندما تكون متأكدًا من عدم وجود مكررات لأفضل أداء
📝 تمارين
- استخدم
UNIONلدمج الموظفين الذين رواتبهم فوق 8000 من جدولemployeesوأسماء الأقسام التي ميزانياتها فوق 100000 من جدولdepartments. - استخدم
INTERSECTللعثور على المدن الموجودة في كلا جدوليemployeesوdepartments. - استخدم
EXCEPTللعثور على المدن التي بها أقسام لكن ليس بها موظفين معيّنين. - فكر: ماذا يحدث إذا لم تتطابق أنواع أعمدة نتائج الاستعلامين تمامًا (مثل INT وVARCHAR) في عملية مجموعة؟
الدرس التالي
سندرس بعد ذلك القيود والمفاتيح — افهم كيفية استخدام PRIMARY KEY وFOREIGN KEY وغيرها من القيود لضمان سلامة البيانات.



