المنطق ثلاثي القيم وUNKNOWN
سبب عدم صحة NULL = NULL وكيف تنتقل UNKNOWN عبر الشروط
المنطق ثلاثي القيم وUNKNOWN درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
لماذا يربك NULL المرشحين
يُعد NULL المصدر الأول للإجابات الخاطئة في مقابلات SQL. يكمن الفخ في التعامل معه كأنه قيمة عادية، بينما NULL يعني «غير معروف» أو «مفقود»، وليس صفرًا ولا سلسلة فارغة.
يحب المحاورون هذا الفخ لأن الصياغة تبدو صحيحة، لكن النتيجة تكون خاطئة من دون أي تنبيه. قد يعرضون عليك عامل تصفية «يُفترض» أن يعيد صفًا، ثم يسألونك لماذا لا يعيد شيئًا.
في هذا الدرس ستبني النموذج الذهني الذي يبدد كل أسئلة NULL: المنطق ثلاثي القيم. وبمجرد أن تستوعب أن المقارنات قد تُرجع TRUE أو FALSE أو UNKNOWN، ستتضح بقية الأمور.
NULL ليست قيمة
أهم جملة يمكنك قولها في مقابلة: NULL هو غياب قيمة، وليس قيمة بحد ذاته.
وهذا يعني أنه لا يمكنك مقارنته باستخدام = بالطريقة التي تقارن بها الأرقام. فلا تعرف قاعدة البيانات ما إذا كانت قيمتان غير معروفتين متساويتين، ولذلك ترفض الجزم بأن النتيجة TRUE أو FALSE.
NULL = 5ليست FALSE، بل هي UNKNOWNNULL = NULLليست TRUE، بل هي UNKNOWNNULL <> NULLهي أيضًا UNKNOWN
ولهذا يؤدي عامل المساواة الساذج على عمود يقبل NULL إلى إسقاط الصفوف بصمت.
المنطق ثنائي القيم مقابل المنطق ثلاثي القيم
تستخدم معظم لغات البرمجة المنطق ثنائي القيم، إذ يكون التعبير إما TRUE أو FALSE. ويضيف SQL نتيجة ثالثة هي UNKNOWN كلما شارك NULL في مقارنة.
لذلك يمكن لأي شرط في SQL أن يقيّم إلى إحدى ثلاث نتائج: TRUE أو FALSE أو UNKNOWN. تحتفظ جملة WHERE بالصف فقط عندما تكون نتيجة شرطه TRUE تمامًا. ويتصرف UNKNOWN مثل FALSE عند التصفية، لكنه ليس الشيء نفسه من الناحية المنطقية.
يختبر المحاورون معرفتك بهذا الفرق، لأن UNKNOWN يتصرف بصورة مختلفة عن FALSE عند استخدام NOT.
عامل تصفية يُسقط الصفوف بصمت
إليك المثال الكلاسيكي المحلول. افترض أن bonus يساوي NULL أحيانًا. يسألك مسؤول التوظيف: «يُفترض أن يعيد هذا الاستعلام كل من لا تساوي مكافأته 1000. لماذا يتجاوز الموظفين الذين لا يملكون مكافأة؟»
بالنسبة إلى صف تكون فيه قيمة bonus هي NULL، يقيّم التعبير bonus <> 1000 إلى UNKNOWN، لا إلى TRUE. وتحتفظ WHERE بالصفوف التي تكون نتيجتها TRUE فقط، لذلك يختفي هؤلاء الموظفون.
الحل هو معالجة NULL صراحةً، وسنغطي ذلك في الدرس التالي. أما الآن، فأدرك أن الصفوف المفقودة نتيجة منطقية وليست خطأً.
SELECT name, bonus
FROM employees
WHERE bonus <> 1000;
-- Rows where bonus IS NULL are excluded:
-- NULL <> 1000 evaluates to UNKNOWN, not TRUENULL في تعبيرات AND
يغيّر المنطق ثلاثي القيم طريقة عمل AND. احفظ القاعدة، وستتمكن من الإجابة عن أي سؤال يتعلق بجدول الحقيقة فورًا.
- TRUE AND UNKNOWN = UNKNOWN
- FALSE AND UNKNOWN = FALSE
- UNKNOWN AND UNKNOWN = UNKNOWN
الفكرة هي أن AND يحتاج إلى FALSE واحد فقط ليكون FALSE بشكل قاطع. لذلك يظل FALSE AND أي شيء مساويًا لـ FALSE. أما TRUE AND قيمة غير معروفة، فتبقى غير معروفة، لأن الطرف المجهول قد ينتهي إلى أي من الاحتمالين.
-- If status = 'active' is TRUE but bonus = 100 is UNKNOWN:
SELECT *
FROM employees
WHERE status = 'active' AND bonus = 100;
-- Combined result is UNKNOWN, so the row is NOT returnedNULL في تعبيرات OR
يناظر OR العامل AND. فهو يحتاج إلى TRUE واحد فقط ليكون TRUE بشكل قاطع، ولذلك تتجاوز TRUE القيمة المجهولة.
- TRUE OR UNKNOWN = TRUE
- FALSE OR UNKNOWN = UNKNOWN
- UNKNOWN OR UNKNOWN = UNKNOWN
لذلك قد يطابق الصف شرط OR حتى عندما يكون أحد الفرعين مجهولًا، ما دام فرع آخر TRUE فعلًا. وهذا سؤال متابعة شائع بعد سؤال AND.
SELECT *
FROM employees
WHERE department = 'Sales' OR bonus = 100;
-- A Sales employee with NULL bonus:
-- TRUE OR UNKNOWN = TRUE, so the row IS returnedNOT تعكس TRUE وFALSE، لا UNKNOWN
إليك النقطة الدقيقة التي يحتفظ بها المحاورون عادةً للنهاية. تعكس NOT TRUE إلى FALSE وFALSE إلى TRUE، لكن NOT UNKNOWN تظل UNKNOWN.
ولهذا لا يمكنك ببساطة إحاطة شرط فاشل بـ NOT لقلب النتيجة. فإذا كان bonus = 1000 يقيّم إلى UNKNOWN لصف قيمة bonus فيه هي NULL، فإن NOT (bonus = 1000) يقيّم أيضًا إلى UNKNOWN، ويظل الصف مستبعدًا.
لا تنقذ عملية النفي صفوف NULL؛ وحده الاختبار الصريح IS NULL يفعل ذلك.
-- For a row where bonus IS NULL:
-- bonus = 1000 -> UNKNOWN
-- NOT (bonus = 1000) -> UNKNOWN (still excluded)
SELECT * FROM employees WHERE NOT (bonus = 1000);مثال محلول: فخ NOT IN
هذا أحد أكثر ألغاز NULL شيوعًا في المقابلات. يؤدي استخدام NOT IN مع قائمة تحتوي على NULL إلى عدم إعادة أي صفوف إطلاقًا، وهو ما يفاجئ المرشحين الذين يتوقعون أن يتجاوز NULL فحسب.
فعليًا، يتوسع x NOT IN (1, 2, NULL) إلى x <> 1 AND x <> 2 AND x <> NULL. وتكون المقارنة الأخيرة UNKNOWN، كما أن TRUE AND TRUE AND UNKNOWN تتحول إلى UNKNOWN، ولذلك لا يطابق أي شيء.
البديل الآمن هو NOT EXISTS، إذ لا يتأثر بهذا الفخ.
-- Returns ZERO rows if the subquery yields any NULL
SELECT name
FROM employees
WHERE manager_id NOT IN (SELECT manager_id FROM managers);
-- Each comparison against NULL becomes UNKNOWN,
-- and the AND-chain collapses to UNKNOWN for every row.لماذا يتصرف UNKNOWN مثل FALSE في WHERE
سؤال متابعة شائع: «إذا كان UNKNOWN ليس FALSE، فلماذا يُسقط الصف مثل صف نتيجته FALSE؟»
الإجابة الدقيقة هي أن WHERE وON وHAVING تتبع جميعًا قاعدة الاحتفاظ بـ TRUE فقط. تفشل كل من FALSE وUNKNOWN في هذا الاختبار، ولذلك تبدوان متطابقتين لأغراض التصفية.
يظهر الفرق فقط مع النفي وقيود CHECK. فشرط CHECK يقبل الصف عندما يكون الشرط TRUE أو UNKNOWN، ولذلك قد تتجاوز قيمة NULL قيد CHECK كنت تظن أنه سيمنعها.
-- CHECK passes on TRUE or UNKNOWN, so NULL salary is allowed:
-- CONSTRAINT salary_positive CHECK (salary > 0)
-- INSERT ... salary = NULL -> NULL > 0 is UNKNOWN -> allowedمثال أعمق: COUNT وفجوة تقييم الصواب
اربط المفاهيم معًا من خلال سؤال واقعي في مقابلة: «لدينا 100 موظف. يعيد SELECT COUNT(*) WHERE bonus = 100 النتيجة 30، ويعيد WHERE bonus <> 100 النتيجة 50. أين الموظفون العشرون الآخرون؟»
الموظفون العشرون المفقودون لديهم مكافأة NULL. فلا = 100 ولا <> 100 تكون TRUE بالنسبة إليهم؛ بل تكون النتيجة UNKNOWN في الحالتين، ولذلك يتجاوزهم كلا عاملي التصفية تمامًا.
قولك «لا تتطابق المجموعات مع الإجمالي لأن NULL لا يحقق أيًا من الشرطين» هو بالضبط ما يريد المحاورون سماعه.
SELECT
COUNT(*) FILTER (WHERE bonus = 100) AS eq_100,
COUNT(*) FILTER (WHERE bonus <> 100) AS ne_100,
COUNT(*) FILTER (WHERE bonus IS NULL) AS null_bonus,
COUNT(*) AS total
FROM employees;نقاط مهمة في المقابلة
عندما يظهر منطق NULL، اذكر النقاط التالية لتبدو بمستوى خبير:
- يعني NULL أنه غير معروف؛ والمقارنات معه تعطي UNKNOWN.
- يستخدم SQL منطقًا ثلاثي القيم: TRUE وFALSE وUNKNOWN.
- تحتفظ WHERE وON وHAVING بالصفوف التي تكون نتيجتها TRUE فقط.
- تظل
NOT UNKNOWNمساوية لـ UNKNOWN، ولذلك لا تستعيد عملية النفي صفوف NULL. - يعيد
NOT INمع أي NULL صفرًا من الصفوف؛ لذا يُفضّل استخدامNOT EXISTS.
اعرض النموذج أولًا، ثم استعرض جدول الحقيقة. فهذا الترتيب يدل على أنك تفهم السبب، لا الحيلة فحسب.
تحقق سريع
اختبر مدى استيعابك للمنطق ثلاثي القيم.
مراجعة
أصبح لديك الآن النموذج الذهني الأساسي للتعامل مع NULL:
- NULL غير معروف وليس قيمة؛ فلا تقارنه أبدًا باستخدام
=أو<>. - يستخدم SQL ثلاث قيم؛ إذ تُرجع الشروط TRUE أو FALSE أو UNKNOWN.
- تحتفظ عبارات التصفية بالصفوف التي تكون نتيجتها TRUE فقط؛ فتختفي صفوف UNKNOWN مثل صفوف FALSE.
- يقلب
NOTTRUE وFALSE، لكنه يترك UNKNOWN دون تغيير. - يعيد فخ
NOT INمع NULL صفرًا من الصفوف؛ لذا استخدمNOT EXISTS.
في الدرس التالي: الطريقة الصحيحة لاختبار NULL باستخدام IS NULL وIS NOT NULL وعوامل المساواة الآمنة مع NULL.
الأسئلة الشائعة
هل درس «المنطق ثلاثي القيم وUNKNOWN» مجاني؟
نعم — نص درس «المنطق ثلاثي القيم وUNKNOWN» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «المنطق ثلاثي القيم وUNKNOWN»؟
سبب عدم صحة NULL = NULL وكيف تنتقل UNKNOWN عبر الشروط تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «المنطق ثلاثي القيم وUNKNOWN»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المنطق ثلاثي القيم وUNKNOWN
- IS NULL وIS NOT NULL والمساواة الآمنة مع NULL
- COALESCE وNULLIF وISNULL
- قيم NULL في التجميعات وعمليات الربط وDISTINCT