LEFT JOIN والحفاظ على الصفوف غير المطابقة
ما الذي يحتفظ به LEFT JOIN وكيف تظهر قيم NULL للصفوف غير المطابقة
LEFT JOIN والحفاظ على الصفوف غير المطابقة درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
إعداد المقابلة
يقول أحد المحاورين: «اعرض قائمة بكل عميل وطلباته، بما في ذلك العملاء الذين لم يطلبوا شيئًا من قبل». تُسقط INNER JOIN العملاء الذين ليس لديهم طلبات، ولذلك لا تفي بهذا الشرط. إذًا المطلوب هو LEFT JOIN.
يُبقي LEFT JOIN كل صف من الجدول الأيسر (المذكور أولًا)، ويُلحق به الصفوف المطابقة من الجدول الأيمن عند وجودها. يقدّم هذا الدرس النموذج الذهني الدقيق الذي يتوقعه المحاورون.
ما الذي يضمنه LEFT JOIN
القاعدة الأساسية: يظهر كل صف من الجدول الأيسر في الناتج مرة واحدة على الأقل، سواء وُجد تطابق أم لا.
- إذا وجد صف أيسر تطابقات في الجانب الأيمن، فستحصل على صف ناتج واحد لكل تطابق.
- إذا لم يجد صف أيسر أي تطابق، فستحصل مع ذلك على صف ناتج واحد، وتكون قيم جميع أعمدة الجدول الأيمن فيه
NULL.
لهذا يسمّي المحاورون هذه العملية ربطًا خارجيًا: إذ تُحفظ الصفوف الواقعة خارج مجموعة التطابق بدلًا من إسقاطها.
الجدولان
سنستخدم طوال هذا الدرس جدولين بسيطين. يحتوي customers على جميع العملاء، ويسجّل orders عمليات الشراء ويشير إلى عميل عبر customer_id.
لاحظ أن العميل 3 (Carol) ليس له أي صف في orders. هذا العميل غير المطابق هو بالضبط ما يجب أن يحافظ عليه LEFT JOIN.
-- customers
-- id | name
-- 1 | Alice
-- 2 | Bob
-- 3 | Carol
-- orders
-- id | customer_id | amount
-- 10 | 1 | 50
-- 11 | 1 | 75
-- 12 | 2 | 20كتابة LEFT JOIN
تشبه الصياغة صياغة الربط الداخلي، مع استبدال INNER بـ LEFT (وكلمة OUTER اختيارية: LEFT JOIN وLEFT OUTER JOIN متطابقان).
الجدول المكتوب قبل الكلمة المفتاحية هو الجانب الأيسر المحفوظ. والترتيب مهم: customers LEFT JOIN orders يحافظ على جميع العملاء، وليس على جميع الطلبات.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id;قراءة النتيجة
هذه هي مخرجات ذلك الاستعلام. تطابقت Alice مرتين، ولذلك تظهر مرتين. وتطابق Bob مرة واحدة. أما Carol فلم تجد أي تطابق، ولذلك لا تزال تظهر مع قيمة NULL في العمود amount.
إن صف Carol الوحيد الذي يحتوي على NULL هو العلامة المميزة لـ LEFT JOIN. وعندما يراقبك المحاور وأنت تشرح تفكيرك، يريد أن يسمع: «تبقى الصفوف اليسرى غير المطابقة، مع قيم NULL في الجانب الأيمن».
-- name | amount
-- Alice | 50
-- Alice | 75
-- Bob | 20
-- Carol | NULL <-- preserved, no matchمصدر قيم NULL
لا تُخزَّن قيمة NULL في أي مكان. بل تنشئها قاعدة البيانات اصطناعيًا لأنه لا يوجد صف في الجدول الأيمن يزوّد النتيجة بقيمة amount.
يصبح كل عمود مأخوذ من الجدول الأيمن NULL في الصف الأيسر غير المطابق: فالقيم o.id وo.customer_id وo.amount كلها NULL في صف Carol. وهذا مهم لأن كون o.customer_id بقيمة NULL لا يعني أن العميل لا يملك معرّفًا، بل يعني أنه لم يوجد أي طلب مطابق على الإطلاق.
حساب عدد الطلبات لكل عميل
سؤال متابعة شائع: «كم طلبًا لدى كل عميل، بما في ذلك العملاء الذين لديهم صفر طلبات؟» يجيب LEFT JOIN مع COUNT عن ذلك تمامًا، لكن يجب أن تحسب عمودًا من الجدول الأيمن، لا *.
تتجاهل COUNT(o.id) قيم NULL، ولذلك تكون نتيجة Carol هي 0. أما COUNT(*) فستعيد خطأً القيمة 1 لـ Carol، لأن صف NULL الاصطناعي لا يزال يُحسب صفًا.
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob | 1
-- Carol | 0فخ COUNT(*) مقابل COUNT(column)
هذا فخ كلاسيكي في المقابلات. بعد LEFT JOIN، يوجد الصف الأيسر غير المطابق فعليًا في النتيجة، مع قيم NULL في أعمدة الجانب الأيمن.
- تحسب
COUNT(*)ذلك الصف، فتُعيد 1 لعميل ليس لديه طلبات. - تتخطى
COUNT(o.id)قيمة NULL، فتُعيد 0 بشكل صحيح.
احسب دائمًا عمودًا تكون قيمته NULL في جانب عدم التطابق عندما تحتاج إلى أصفار حقيقية.
-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;الجمع باستخدام LEFT JOIN
تتعامل التجميعات الأخرى غير COUNT بلطف مع قيم NULL الاصطناعية. تتجاهل SUM قيم NULL، ولذلك ينتج عن العميل غير المطابق NULL وليس خطأً.
غالبًا ما يريد المحاورون صفرًا بدلًا من NULL في التقارير. لفّ عملية التجميع داخل COALESCE لاستبدالها بقيمة افتراضية.
SELECT c.name,
COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob | 20
-- Carol | 0الجدول الأيسر مقابل الجدول الأيمن بوضوح
عندما يسألك المحاور «أي جدول يتم الحفاظ عليه؟»، أجب بثقة: الجدول الواقع إلى يسار الكلمة المفتاحية JOIN. اقرأ الصياغة من اليسار إلى اليمين.
A LEFT JOIN B = الاحتفاظ بكل صفوف A. وللاحتفاظ بكل صفوف B بدلًا من ذلك، إمّا أن تقلب الترتيب إلى B LEFT JOIN A أو تستخدم RIGHT JOIN. تفضّل معظم الفرق استخدام LEFT JOIN حصريًا لوضوح القراءة، وذلك ببساطة عبر إعادة ترتيب الجداول.
قائمة مراجعة ذهنية
عندما ترى LEFT JOIN في مقابلة، استعرض قائمة المراجعة التالية بصوت عالٍ:
- ما الجانب المحفوظ؟ الجدول الأيسر، إذ تُحفظ جميع صفوفه.
- ماذا يحدث للصفوف غير المطابقة؟ تظهر مرة واحدة مع قيم NULL من الجانب الأيمن.
- هل تحسب عددًا؟ استخدم
COUNT(right_col)للحصول على أصفار حقيقية. - هل تجمع قيمًا؟ لفّ العملية داخل
COALESCEإذا كنت تحتاج إلى 0 لا NULL.
إن التعبير عن قائمة المراجعة هذه شفهيًا يدل على دقة بمستوى الخبراء.
تحقق سريع
اختبر حدسك بشأن LEFT JOIN عند حساب الأعداد.
مراجعة
يحافظ LEFT JOIN على كل صف من صفوف الجدول الأيسر. ترتبط الصفوف اليسرى المطابقة بتطابقاتها اليمنى، بينما تبقى الصفوف اليسرى غير المطابقة مرة واحدة مع NULL في جميع أعمدة الجدول الأيمن.
- الجدول الأيسر هو الجدول المكتوب قبل الكلمة المفتاحية
JOIN. - تشير قيم NULL الاصطناعية إلى الصفوف التي لم تجد تطابقًا.
- يعطي
COUNT(right_col)أصفارًا حقيقية، بخلافCOUNT(*). - تحوّل
COALESCE(SUM(...), 0)الإجماليات التي قيمتها NULL إلى صفر.
يشكّل هذا الأساس للعثور على البيانات المفقودة وعمليات anti-join في الدروس القادمة.
الأسئلة الشائعة
هل درس «LEFT JOIN والحفاظ على الصفوف غير المطابقة» مجاني؟
نعم — نص درس «LEFT JOIN والحفاظ على الصفوف غير المطابقة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «LEFT JOIN والحفاظ على الصفوف غير المطابقة»؟
ما الذي يحتفظ به LEFT JOIN وكيف تظهر قيم NULL للصفوف غير المطابقة تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟
لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «LEFT JOIN والحفاظ على الصفوف غير المطابقة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟
نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- LEFT JOIN والحفاظ على الصفوف غير المطابقة
- دلالات RIGHT وFULL OUTER JOIN
- العثور على الصفوف دون تطابق (Anti-Join)
- فخ WHERE في الربط الخارجي