عمليات المجموعات

عمليات المجموعات

🌍 تشبيه من العالم الحقيقي

تخيّل أن لديك بطاقتين عمل:

عمليات المجموعات تُجري عمليات "دمج وتقاطع وفرق" على مجموعتي نتائج استعلام.


🎯 المفاهيم الأساسية

UNION — دمج مع إزالة التكرارات

يدمج مجموعتي نتائج، مع إزالة الصفوف المكررة تلقائيًا.

SQL
SELECT city FROM employees
UNION
SELECT city FROM departments;

UNION ALL — دمج بدون إزالة التكرارات

يدمج مجموعتي نتائج، مع الاحتفاظ بجميع الصفوف المكررة. أفضل أداءً لأنه لا يحتاج إلى إزالة التكرارات.

SQL
SELECT city FROM employees
UNION ALL
SELECT city FROM departments;

INTERSECT — تقاطع

يُرجع الصفوف التي توجد في كلا المجموعتين.

SQL
SELECT city FROM employees
INTERSECT
SELECT city FROM departments;

EXCEPT / MINUS — فرق

يُرجع الصفوف الموجودة في مجموعة النتائج الأولى لكن غير الموجودة في الثانية.

SQL
-- 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 في النهاية يمكن استخدامه مرة واحدة فقط في نهاية البيان تمامًا
SQL
-- صحيح: عمودان، الأنواع متطابقة
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 لأفضل أداء.


📝 الصيغة الأساسية

SQL
-- صيغة 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 الخاص به

📌 أمثلة

مثال: استعلام عن جميع مصادر الأسماء

دمج أسماء الموظفين وأسماء الأقسام في مجموعة نتائج واحدة.

SQL
-- عرض جميع مصادر "الاسم": موظفين + مديري الأقسام
SELECT first_name AS name, 'Employee' AS source
FROM employees
UNION ALL
SELECT department_name, 'Department'
FROM departments
ORDER BY source;
▶ جرّب الكود

الشرح: تمت إضافة عمود ثابت لتمييز مصدر البيانات لسهولة التمييز.

مثال: العثور على مدن بها موظفين لكن بدون أقسام

SQL
-- مدن بها موظفين ناقص مدن بها أقسام
SELECT city FROM employees
EXCEPT
SELECT city FROM departments;
▶ جرّب الكود

النهج: استخدم EXCEPT كعملية فرق للعثور بسرعة على "المدن التي تظهر فقط في الموظفين."


🎬 سيناريوهات عملية

السيناريو 1: دمج قوائم عملاء متعددة القنوات

الشركة لديها جداول عملاء عبر الإنترنت وخارج الإنترنت تحتاج إلى دمجها وإزالة تكراراتها لإنشاء دليل عملاء كامل.

SQL
-- عملاء عبر الإنترنت
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: مقارنة اختلافات المبيعات بين شهرين

العثور على منتجات تم بيعها هذا الشهر لكن ليس الشهر الماضي.

SQL
-- المنتجات المباعة هذا الشهر
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 فرق مجموعتي نتائج

📝 تمارين

  1. استخدم UNION لدمج الموظفين الذين رواتبهم فوق 8000 من جدول employees وأسماء الأقسام التي ميزانياتها فوق 100000 من جدول departments.
  2. استخدم INTERSECT للعثور على المدن الموجودة في كلا جدولي employees و departments.
  3. استخدم EXCEPT للعثور على المدن التي بها أقسام لكن ليس بها موظفين معيّنين.
  4. فكر: ماذا يحدث إذا لم تتطابق أنواع أعمدة نتائج الاستعلامين تمامًا (مثل INT وVARCHAR) في عملية مجموعة؟

الدرس التالي

سندرس بعد ذلك القيود والمفاتيح — افهم كيفية استخدام PRIMARY KEY وFOREIGN KEY وغيرها من القيود لضمان سلامة البيانات.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%