محاكاة عمليات المجموعات باستخدام عمليات الربط
إعادة كتابة EXCEPT وINTERSECT في اللهجات التي لا تدعمهما
محاكاة عمليات المجموعات باستخدام عمليات الربط درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
سبب محاكاة عمليات المجموعات
لا تدعم كل قواعد البيانات INTERSECT وEXCEPT. فعلى سبيل المثال، كانت الإصدارات الأقدم من MySQL تفتقر إليهما تمامًا. يختبر المحاورون قدرتك على إعادة إنتاج منطق المجموعات باستخدام عمليات الربط والاستعلامات الفرعية عندما لا يتوفر المعامل.
إن معرفتك بمعامل المجموعة وبما يعادله باستخدام الربط تثبت أنك تفهم ما يحسبه المعامل فعليًا.
محاكاة INTERSECT باستخدام INNER JOIN
يعثر INTERSECT على الصفوف المشتركة بين مجموعتين. والمعادل باستخدام الربط هو INNER JOIN على جميع الأعمدة التي تجري مقارنتها، مع إضافة DISTINCT لمحاكاة سلوك إزالة التكرار.
يصبح كل عمود تجري مقارنته جزءًا من شرط الربط.
-- A INTERSECT B emulated:
SELECT DISTINCT a.customer_id
FROM orders_2023 a
JOIN orders_2024 b
ON a.customer_id = b.customer_id;سبب الحاجة إلى DISTINCT مع INTERSECT
قد يؤدي INNER JOIN العادي إلى توسيع النتائج: فإذا ظهرت قيمة عدة مرات في أي من الطرفين، يضاعف الربط عدد الصفوف. ويعيد INTERSECT القياسي كل صف مشترك مرة واحدة، لذلك تضيف DISTINCT لدمج التكرارات التي أدخلها الربط.
نسيان DISTINCT هنا خطأ شائع في المقابلات.
-- without DISTINCT, a customer with 3 orders in each year
-- would appear 9 times from the joinEXCEPT باستخدام LEFT JOIN / IS NULL
EXCEPT (A ولكن ليس B) هو الربط المضاد. والصيغة المتوافقة مع مختلف اللهجات هي تنفيذ LEFT JOIN من A إلى B على جميع الأعمدة، مع الاحتفاظ بالصفوف التي يكون فيها جانب B مساويًا لـ NULL (أي لا يوجد تطابق)، ثم تطبيق DISTINCT.
يُعد نمط LEFT JOIN / IS NULL من أكثر الحيل استخدامًا في مقابلات SQL.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
LEFT JOIN orders_2024 b
ON a.customer_id = b.customer_id
WHERE b.customer_id IS NULL;EXCEPT باستخدام NOT EXISTS
يمكن أيضًا كتابة EXCEPT بصيغة متوافقة مع مختلف اللهجات باستخدام NOT EXISTS. ويُقرأ هذا الاستعلام على النحو الآتي: «احتفظ بكل صف من A لا يوجد له صف مطابق في B»، كما أنه يتعامل مع NULLs بصورة سليمة.
يفضل كثير من المهندسين NOT EXISTS لأن الغرض منه واضح، ولأنه يتجنب مشكلة NOT IN مع NULL.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE NOT EXISTS (
SELECT 1 FROM orders_2024 b
WHERE b.customer_id = a.customer_id
);INTERSECT باستخدام EXISTS
وبالمثل، يمكن كتابة INTERSECT باستخدام EXISTS: احتفظ بكل صف مختلف من A يوجد له صف مطابق في B.
يتوقف EXISTS عند أول تطابق، لذلك قد يكون فعالًا، كما أنه يتجنب تضخم الصفوف الناتج عن الربط، مما يلغي أحيانًا الحاجة إلى DISTINCT في جانب الربط.
SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE EXISTS (
SELECT 1 FROM orders_2024 b
WHERE b.customer_id = a.customer_id
);فخ NULL مع NOT IN
قد تبدو محاكاة EXCEPT باستخدام NOT IN خيارًا مناسبًا، لكنها خطيرة: فإذا أعاد الاستعلام الفرعي أي قيمة NULL، فلن يعيد NOT IN أي صفوف على الإطلاق، لأن المقارنة تصبح UNKNOWN.
هذه من الأخطاء الشائعة التي تُختبر كثيرًا. استخدم NOT EXISTS أو LEFT JOIN / IS NULL، فهما آمنان مع NULL.
-- RISKY if orders_2024.customer_id can be NULL:
SELECT DISTINCT customer_id FROM orders_2023
WHERE customer_id NOT IN (
SELECT customer_id FROM orders_2024
);المطابقة على عدة أعمدة
عندما تمتد مقارنة المجموعات إلى عدة أعمدة، يجب أن يشارك كل عمود في شرط الربط. وفي الربط المضاد، يجب أيضًا التعامل مع احتمال احتواء هذه الأعمدة على NULL، وهنا تتألق NOT EXISTS.
اذكر كل عمود صراحةً في جملة ON؛ فنسيان أحدها يغيّر بهدوء معنى «الصف المتساوي».
SELECT DISTINCT a.id, a.city
FROM a
LEFT JOIN b
ON a.id = b.id AND a.city = b.city
WHERE b.id IS NULL;محاكاة UNION من دون المعامل
إن UNION ALL هو مجرد دمج، وتدعمه كل لهجات SQL مباشرةً. ولإنشاء محاكاة لـ UNION المميز عند الحاجة، ادمج الاستعلامات باستخدام UNION ALL داخل استعلام فرعي، ثم غلّفه بـ SELECT DISTINCT أو GROUP BY على جميع الأعمدة.
يوضح هذا أن UNION ما هو إلا UNION ALL مضافًا إليه خطوة لإزالة التكرارات.
SELECT DISTINCT * FROM (
SELECT city FROM a
UNION ALL
SELECT city FROM b
) combined;اختيار المحاكاة المناسبة
دليل الاختيار:
- INTERSECT →
EXISTSأو INNER JOIN + DISTINCT. - EXCEPT →
NOT EXISTSأو LEFT JOIN / IS NULL. - تجنب
NOT INعند احتمال وجود NULL. - UNION → UNION ALL مغلفًا بـ DISTINCT.
يُعد EXISTS / NOT EXISTS الخيارين الأكثر توافقًا مع مختلف اللهجات والأكثر أمانًا مع NULL، ولذلك فهما الإجابة الأكثر أمانًا في المقابلات.
ربط المفاهيم معًا
إن قدرتك على تحويل معاملات المجموعات إلى عمليات ربط تُظهر أنك تفهمها بوصفها منطقًا للمجموعات، لا مجرد صياغة. والربط المضاد (LEFT JOIN / IS NULL أو NOT EXISTS) هو النمط الأعلى قيمة: فهو يظهر في محاكاة EXCEPT، والعثور على السجلات اليتيمة، وأسئلة السجلات المفقودة على حد سواء.
ابدأ بـ NOT EXISTS لضمان الصحة، ثم اذكر صيغة الربط عند مناقشة الأداء.
تحقق سريع
قاعدة بياناتك لا تدعم EXCEPT. وتحتاج إلى customer_ids الموجودة في orders_2023 وغير الموجودة في orders_2024، مع احتمال احتواء العمود على NULLs.
مراجعة
أهم النقاط:
INTERSECT→ INNER JOIN + DISTINCT، أوEXISTS.EXCEPT→ LEFT JOIN / IS NULL، أوNOT EXISTS(الربط المضاد).- أضف
DISTINCTلمطابقة سلوك معاملات المجموعات في إزالة التكرارات، وللحد من تضخم الصفوف الناتج عن الربط. - تجنب
NOT INعند احتمال وجود NULL؛ وفضّل NOT EXISTS. UNION= UNION ALL مغلفًا بـ DISTINCT.
الأسئلة الشائعة
هل درس «محاكاة عمليات المجموعات باستخدام عمليات الربط» مجاني؟
نعم — نص درس «محاكاة عمليات المجموعات باستخدام عمليات الربط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «محاكاة عمليات المجموعات باستخدام عمليات الربط»؟
إعادة كتابة EXCEPT وINTERSECT في اللهجات التي لا تدعمهما تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «محاكاة عمليات المجموعات باستخدام عمليات الربط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- UNION مقابل UNION ALL
- توافق عدد الأعمدة والأنواع
- INTERSECT وEXCEPT للمقارنة
- محاكاة عمليات المجموعات باستخدام عمليات الربط