0Pricing
SQL Interview Prep · درس

ON مقابل WHERE في عمليات الربط

متى ينتمي الشرط إلى ON أو WHERE ولماذا يؤثر ذلك في النتائج

ON مقابل WHERE في عمليات الربط درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.

يمكن أن يوجد المسند في موضعين

بعد أن تتمكنوا من كتابة INNER JOIN، سيكون سؤال المقابلة التالي أكثر دقة: هل ينتمي هذا الشرط إلى ON أم إلى WHERE؟

في حالة INNER JOIN، غالبًا ما تكون الإجابة: "لا يهم ذلك بالنسبة إلى النتيجة". لكن بمجرد التبديل إلى ربط خارجي، يغيّر الاختيار الإجابة بالكامل. يطرح القائمون على المقابلات هذا السؤال تحديدًا لأن المبتدئين يضعون كل شيء في WHERE بدافع العادة.

يوضّح هذا الدرس القاعدة بوضوح.

ما الذي يفعله ON

يحدّد بند ON كيفية إقران الصفوف. ويُنفَّذ أثناء بناء الربط، فيقرّر أي صف من الجدول الأيسر يطابق أي صف من الجدول الأيمن.

فكّروا في ON بوصفه إجابة عن السؤال: "هل ينتمي هذان الصفان معًا؟"

SELECT c.name, o.amount
FROM customers c
JOIN orders o
  ON o.customer_id = c.id;   -- pairing rule

ما الذي يفعله WHERE

يُنفَّذ بند WHERE بعد أن ينتج الربط صفوفه الموحّدة. وهو يرشّح مجموعة النتائج هذه، فيستبعد الصفوف التي تفشل في الاختبار.

فكّروا في WHERE بوصفه إجابة عن السؤال: "بعد أن ربطت الصفوف، أيًّا منها أريد الاحتفاظ به؟"

SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;   -- filter after pairing

في INNER JOIN غالبًا ما تكون النتيجة واحدة

في حالة INNER JOIN، يعطي المرشّح الإضافي النتيجة نفسها سواء وضعتموه في ON أم في WHERE. يعيد الاستعلامان أدناه طلب Ada بقيمة $50 وطلب Bob بقيمة $99 فقط.

لأن الصفوف غير المتطابقة تُحذف أصلًا بواسطة الربط الداخلي، فإن نقل المسند لا يغيّر الصفوف التي تبقى.

-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;

-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;

لماذا تفضّل الصياغة وضع مفاتيح الربط في ON

حتى عندما تتطابق النتائج، تنصّ القاعدة المتّبعة على وضع شروط علاقة الربط في ON ومرشّحات الأعمال في WHERE.

  • ON: o.customer_id = c.id (كيفية ارتباط الجدولين)
  • WHERE: o.amount > 30 (النتائج التي تريدونها)

يجعل هذا الفصل المقصود واضحًا للقارئ التالي وللقائم على المقابلة الذي يقيّم أسلوبكم.

حيث تظهر الأهمية الحقيقية: عمليات الربط الخارجية

يصبح الفرق حاسمًا مع LEFT JOIN، الذي يحتفظ بكل صف أيسر حتى عندما لا يطابقه أي صف أيمن. إليكم معاينة سريعة باستخدام العملاء والطلبات، حيث لا توجد لدى Cleo أي طلبات.

يحتفظ LEFT JOIN بـ Cleo مع وضع NULL في أعمدة الطلب. والآن راقبوا تأثير ON وWHERE عليها.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)

المرشّح في ON: الصفوف محفوظة

ضعوا الشرط amount > 30 في ON عند استخدام LEFT JOIN، فيؤثر ذلك فقط في الصفوف اليمنى التي تُرفق. وتظل الصفوف اليسرى غير المتطابقة محفوظة، مع وضع NULL فيها.

تبقى Cleo في النتيجة. وأي طلب يفشل في الاختبار لا يُرفق ببساطة، فتظل القيمة NULL.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL  (3 rows, Cleo kept)

المرشّح في WHERE: ينهار الربط الخارجي

انقلوا الشرط نفسه إلى WHERE، وبذلك ترشّحون نتيجة الربط. يحتوي صف Cleo على amount = NULL، وNULL > 30 ليست قيمة صحيحة، لذلك يُحذف صفها.

يتصرف LEFT JOIN عندها بصمت مثل INNER JOIN. وهذا أشهر فخ في عمليات الربط في المقابلات.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99  (Cleo GONE -> back to inner-join behavior)

القاعدة التي ينبغي حفظها

اذكروا ذلك بوضوح في المقابلة:

  • يحدّد الشرط في ON ما إذا كان الصف الأيمن سيُرفق؛ وتظل الصفوف اليسرى محفوظة.
  • يرشّح الشرط في WHERE الصفوف النهائية، ويمكنه إزالة الصفوف اليسرى المحفوظة عندما يتعامل مع عمود قد يحتوي على NULL.

لذلك، في عمليات الربط الخارجية، ضعوا المسندات الخاصة بالجدول الاختياري في ON، إلا إذا كنتم تريدون عمدًا حذف الصفوف غير المتطابقة.

الاستخدام المشروع لـ WHERE مع NULL

هناك حالة واحدة يكون فيها ترشيح عمود مربوط خارجيًا في WHERE صحيحًا تمامًا: وهي الربط المضاد. ويؤدي اختبار IS NULL إلى العثور على الصفوف اليسرى التي لم تجد تطابقًا.

يحتفظ WHERE هنا عمدًا بالصفوف غير المتطابقة فقط، فيعيد العملاء الذين ليس لديهم أي طلبات. الآلية نفسها، لكن القصد معاكس.

SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;   -- customers with no orders -> Cleo

اختبار ذهني سريع

قبل الاختبار، استخدموا قائمة التحقق هذه عند رؤية شرط ربط:

  • هل هو مفتاح ربط يربط الجدولين؟ -> ON.
  • هل هو مرشّح للجدول الإلزامي؟ -> يمكن استخدام WHERE أو ON.
  • هل هو مرشّح للجدول الاختياري (الخارجي)، وتريدون الاحتفاظ بالصفوف غير المتطابقة؟ -> ON.
  • هل تريدون العثور على الصفوف غير المتطابقة؟ -> WHERE ... IS NULL.

اختبار سريع

طبّقوا قاعدة ON مقابل WHERE على ربط خارجي.

مراجعة: ON مقابل WHERE

النقاط الأساسية التي ينبغي أخذها إلى المقابلة:

  • يتحكم ON في الإقران، ويحدّد في عمليات الربط الخارجية ما إذا كان الصف الاختياري سيُرفق، مع الحفاظ على الجانب الذي يجب إبقاؤه.
  • يرشّح WHERE النتيجة المرتبطة مسبقًا، ويمكنه حذف الصفوف المحفوظة.
  • غالبًا ما يكون الاثنان قابلين للتبادل في INNER JOIN، لكنهما ليسا كذلك في عمليات الربط الخارجية.
  • يجب وضع المرشّحات الخاصة بالجدول الخارجي في ON، إلا إذا كنتم تقصدون إجراء ربط مضاد باستخدام IS NULL في WHERE.

الأسئلة الشائعة

هل درس «ON مقابل WHERE في عمليات الربط» مجاني؟

نعم — نص درس «ON مقابل WHERE في عمليات الربط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «ON مقابل WHERE في عمليات الربط»؟

متى ينتمي الشرط إلى ON أو WHERE ولماذا يؤثر ذلك في النتائج تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟

لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «ON مقابل WHERE في عمليات الربط»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟

نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. كيفية مطابقة INNER JOIN للصفوف
  2. ON مقابل WHERE في عمليات الربط
  3. توسّع الربط وتضاعف الصفوف
  4. ربط ثلاثة جداول أو أكثر
← العودة إلى SQL Interview Prep