كيف تتعامل MySQL مع مزج UNION وUNION ALL في استعلام واحد؟

متقدمقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

عند مزج UNION ALL وUNION في سلسلة واحدة غير محاطة بتجميعات تغير نطاق العمليات، يجب النظر إلى موضع حذف التكرار. تعني UNION دون كلمة إضافية UNION DISTINCT، وتحذف التكرار من النتيجة المجمعة إلى يسارها ومن الفرع الذي تدمجه معها.

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

مثال

SELECT 1 AS n
UNION ALL
SELECT 1 AS n
UNION
SELECT 2 AS n
ORDER BY n;

تظهر أهمية هذه القاعدة في الاستعلامات الطويلة التي تجمع مصادر عديدة. قراءة السلسلة كاملة وتحديد مواضع حذف التكرار يمنعان توقع أعداد صفوف غير صحيحة.

باختصار: قد تحذف UNION تكرارات نتجت عن UNION ALL إلى يسارها؛ فموضع كل عملية يؤثر في النتيجة.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما القيم التي يعيدها هذا الاستعلام بالترتيب؟

CREATE TABLE tasks (id INT PRIMARY KEY);
INSERT INTO tasks (id) VALUES (1), (2);

SELECT id FROM tasks WHERE id = 1
UNION ALL
SELECT id FROM tasks WHERE id = 1
UNION
SELECT id FROM tasks WHERE id = 2
ORDER BY id;