SQL: عمليات المجموعات
آخر تحديث: 2026-10-09
1. 🌍 تشبيه من العالم الحقيقي
تخيّل أن لديك بطاقتين عمل:
- UNION — ادمج الرزمتين، مع الاحتفاظ بنسخة واحدة فقط من المكررات
- UNION ALL — ادمج جميع البطاقات من الرزمتين، مع الاحتفاظ بالمكررات
- INTERSECT — اختر فقط those الذين يظهرون في الرزمتين
- EXCEPT — أزل من الرزمة الأولى anyone يظهر أيضًا في الرزمة الثانية
عمليات المجموعات تُجري عمليات "دمج وتقاطع وفرق" على مجموعتي نتائج استعلام.
2. 🎯 المفاهيم الأساسية
(1) UNION — دمج مع إزالة التكرارات
يدمج مجموعتي نتائج، مع إزالة الصفوف المكررة تلقائيًا.
SELECT city FROM employees
UNION
SELECT city FROM departments;
(2) UNION ALL — دمج بدون إزالة التكرارات
يدمج مجموعتي نتائج، مع الاحتفاظ بجميع الصفوف المكررة. أفضل أداءً لأنه لا يحتاج إلى إزالة التكرارات.
SELECT city FROM employees
UNION ALL
SELECT city FROM departments;
(3) INTERSECT — تقاطع
يُرجع الصفوف التي توجد في كلا المجموعتين.
SELECT city FROM employees
INTERSECT
SELECT city FROM departments;
(4) 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;
(5) قواعد مطابقة الأعمدة
عند استخدام عمليات المجموعات، يجب أن تفي بيانا 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; -- ❌ عدم تطابق عدد الأعمدة
(6) 💡 متى تستخدم أي عملية
| العملية | السيناريو | إزالة التكرارات | الأداء |
|---|---|---|---|
| UNION | تحتاج إلى دمج وإزالة التكرارات | ✅ نعم | أبطأ |
| UNION ALL | دمج بدون إزالة التكرارات | ❌ لا | أسرع |
| INTERSECT | العثور على الأجزاء المشتركة | ✅ نعم | متوسط |
| EXCEPT | العثور على الاختلافات | ✅ نعم | متوسط |
UNION ALL لأفضل أداء.
3. 📝 الصيغة الأساسية
-- صيغة 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 الخاص به
4. 📌 أمثلة
▶ مثال: استعلام عن جميع مصادر الأسماء
دمج أسماء الموظفين وأسماء الأقسام في مجموعة نتائج واحدة.
-- عرض جميع مصادر "الاسم": موظفين + مديري الأقسام
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 كعملية فرق للعثور بسرعة على "المدن التي تظهر فقط في الموظفين."
5. 🎬 سيناريوهات عملية
(1) السيناريو 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) السيناريو 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 ALL لأنه لا يتطلب خطوة إزالة تكرارات إضافية وأداؤه أفضل. استخدم UNION فقط عندما تحتاج تحديدًا إلى إزالة التكرارات.SELECT الأول. ومع ذلك، يجب أن يتطابق عدد الأعمدة وأنواع بيانات الأعمدة المقابلة.INTERSECT يطابق الصفوف الكاملة للتقاطع، بينما JOIN يربط الجداول بناءً على شروط محددة. استخدم INTERSECT عندما تحتاج إلى "العثور على صفوف متطابقة"، واستخدم JOIN عندما تحتاج إلى "ربط أعمدة من جداول مختلفة حقل".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) في عملية مجموعة؟
6. الدرس التالي
سندرس بعد ذلك القيود والمفاتيح — افهم كيفية استخدام PRIMARY KEY وFOREIGN KEY وغيرها من القيود لضمان سلامة البيانات.