SUM وAVG مع NULL
سبب تجاهل AVG لقيم NULL وكيف يغير ذلك الإجابة المتوقعة في المقابلات
SUM وAVG مع NULL درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
الفخ المختبئ في AVG
إليكم سؤالًا كلاسيكيًا في المقابلات يُربك المرشحين غير المتأنين: «لديكم عمود للرواتب يحتوي على بعض قيم NULL. ماذا يحسب AVG(salary)، وهل هذا هو ما يريده العمل؟»
تكشف الإجابة الصادقة ما إذا كنتم تفهمون أن دوال التجميع تتجاهل NULL، مما يغيّر مقام المتوسط. وإذا أخطأتم في ذلك ضمن بيئة الإنتاج، فسيكون المتوسط المعلن أعلى من الواقع دون أي تنبيه.
لنجعل هذا السلوك واضحًا تمامًا.
بيانات نموذجية
استخدموا جدول employees هذا الذي يحتوي على عمود bonus يسمح بقيم NULL طوال الدرس:
- Alice، مكافأة 100
- Bob، مكافأة 200
- Carol، مكافأة NULL
- Dan، مكافأة 300
أربعة صفوف، وثلاث مكافآت غير NULL، ومكافأة واحدة تساوي NULL. سنطبّق SUM وAVG على هذه البيانات ونراقب كيفية التعامل مع NULL.
يتجاهل SUM قيم NULL
يجمع SUM(bonus) القيم غير NULL فقط: 100 + 200 + 300 = 600. لا يساهم الصف الذي يحتوي على NULL بأي شيء؛ بل يُتخطّى ببساطة، ولا يُعامل كصفر من الناحية الحسابية بما يغيّر عدد القيم.
والأثر العملي هو نفسه كما لو كانت NULL غائبة. فلا يُصدر SUM خطأً بسبب قيم NULL، ولا يُرجع NULL إلا عندما تكون كل المدخلات NULL.
SELECT SUM(bonus) AS total_bonus
FROM employees;
-- returns 600يتجاهل AVG قيم NULL أيضًا
أما AVG(bonus) فهو الجزء الأهم. إذ يحسب مجموع القيم غير NULL مقسومًا على عدد القيم غير NULL: 600 / 3 = 200.
المقام هو 3، وليس 4. فالصف الذي يحتوي على NULL مستبعد من البسط والمقسوم عليه معًا. ولهذا قد يفاجئ AVG بعض الأشخاص: فالمتوسط يُحسب على القيم الموجودة، لا على جميع الصفوف.
SELECT AVG(bonus) AS avg_bonus
FROM employees;
-- 600 / 3 = 200, NOT 600 / 4 = 150لماذا يهم المقام
لنفترض أن المعنى التجاري للمكافأة التي تساوي NULL هو «لم يحصل الموظف على مكافأة» = 0. عندئذٍ يجب أن يكون المتوسط الحقيقي 600 / 4 = 150، لكن AVG(bonus) يُرجع 200.
الإجابة الصحيحة في المقابلة هي: «يتجاهل AVG قيم NULL، لذا يحسب المتوسط على الموظفين الذين لديهم مكافأة. وإذا كانت NULL تعني صفرًا، فعليّ تحويل قيم NULL إلى 0 أولًا». إن توضيح هذا الفرق هو ما يمنحكم النقطة.
فرض تحويل NULL إلى صفر باستخدام COALESCE
لحساب المتوسط على جميع الصفوف مع اعتبار NULL مساوية للصفر، غلّفوا العمود في COALESCE(bonus, 0). الآن يمتلك كل صف قيمة رقمية، ولذلك يصبح المقام 4.
ينتج عن ذلك 600 / 4 = 150. والخلاصة هي أن AVG(col) وAVG(COALESCE(col, 0)) يجيبان عن سؤالين مختلفين متعلقين بالعمل. اختاروا الصيغة عن قصد.
SELECT AVG(COALESCE(bonus, 0)) AS avg_over_all
FROM employees;
-- 600 / 4 = 150AVG = SUM / COUNT، مع الانتباه
هوية مفيدة: تساوي AVG(col) التعبير SUM(col) / COUNT(col) — لاحظوا استخدام COUNT(col) وليس COUNT(*)، لأن AVG وCOUNT المذكور يتجاهلان قيم NULL معًا.
إذا كتبتم بالخطأ SUM(col) / COUNT(*)، فستحصلون على المتوسط المحسوب على جميع الصفوف (150 هنا)، وهو يختلف عن AVG (200). يطلب مسؤولو المقابلة أحيانًا إعادة بناء AVG يدويًا لمعرفة ما إذا كنتم ستختارون COUNT الصحيح.
SELECT
AVG(bonus) AS builtin_avg, -- 200
SUM(bonus) * 1.0 / COUNT(bonus) AS manual_avg, -- 200
SUM(bonus) * 1.0 / COUNT(*) AS over_all_rows -- 150
FROM employees;مشكلة القسمة الصحيحة
هناك خطأ دقيق قد يحدث عند حساب المتوسطات يدويًا: في كثير من قواعد البيانات، تؤدي قسمة عددين صحيحين إلى قسمة صحيحة تُسقط الكسور العشرية. فقد تعطي 7 / 2 الناتج 3 بدلًا من 3.5.
يعيد AVG عادةً قيمة عشرية، لكن إذا أعدتم بناءه باستخدام SUM / COUNT على أعمدة صحيحة، فقد تفقدون الدقة. اضربوا في 1.0 أو حوّلوا القيمة إلى نوع عشري أولًا.
SELECT
SUM(bonus) / COUNT(bonus) AS maybe_truncated,
SUM(bonus) * 1.0 / COUNT(bonus) AS precise
FROM employees;عندما تكون كل القيم NULL
هذه حالة حدّية يحب مسؤولو المقابلات السؤال عنها: ماذا يحدث إذا كانت كل القيم NULL، أو إذا لم يطابق شرط التصفية أي صف؟
- يُرجع
SUMالقيمة NULL، وليس 0، عندما لا توجد مدخلات غير NULL. - يُرجع
AVGالقيمة NULL أيضًا، لأن القسمة على عدد يساوي صفرًا غير معرّفة. - أما
COUNT، فعلى العكس، يُرجع 0.
غلّفوا النتيجة في COALESCE(SUM(col), 0) إذا كنتم بحاجة إلى قيمة افتراضية رقمية.
SELECT COALESCE(SUM(bonus), 0) AS safe_total
FROM employees
WHERE 1 = 0; -- no rows: returns 0, not NULLالمتوسطات حسب المجموعة
تنطبق قواعد NULL نفسها داخل GROUP BY. يقسم AVG في كل مجموعة على عدد القيم غير NULL في تلك المجموعة. وإذا كانت جميع مكافآت مجموعة ما تساوي NULL، فستكون قيمة AVG لهذه المجموعة هي NULL.
لذلك، عندما تلاحظون متوسطات مفاجئة حسب القسم، فاشتبِهوا أولًا في أن NULL تقلّص مقام كل مجموعة، قبل الاشتباه في وجود خطأ في الربط.
SELECT department, AVG(bonus) AS avg_bonus
FROM employees
GROUP BY department;كيفية صياغة الإجابة
تكون إجابة المقابلة المصاغة بإتقان على النحو التالي: «يتجاهل SUM وAVG قيم NULL معًا. ويقسم AVG على عدد القيم غير NULL، لذا تؤدي NULL فعليًا إلى تقليص المقام. وإذا كان ينبغي اعتبار NULL مساوية للصفر، فأحوّلها باستخدام COALESCE قبل التجميع؛ وإلا فإن المتوسط يعكس الصفوف التي تحتوي على قيمة فقط».
تُظهر هذه الجملة الواحدة صحة الإجابة، والوعي بمتطلبات العمل، وطريقة المعالجة.
تحقق سريع
طبّقوا القاعدة على البيانات النموذجية.
خلاصة
أهم النقاط المتعلقة بـ SUM وAVG مع قيم NULL:
- كلاهما يتجاهل قيم NULL بالكامل.
AVG(col)=SUM(col) / COUNT(col)— فالمقام يستبعد قيم NULL.- استخدموا
COALESCE(col, 0)عندما تعني NULL صفرًا وينبغي احتسابها. - تؤدي المدخلات التي تكون كلها NULL أو التي لا تحتوي على صفوف إلى إرجاع SUM وAVG للقيمة NULL (بينما يُرجع COUNT القيمة 0).
- احذروا من القسمة الصحيحة عند إعادة بناء AVG يدويًا.
التالي: MIN وMAX وتجميع البيانات غير الرقمية.
الأسئلة الشائعة
هل درس «SUM وAVG مع NULL» مجاني؟
نعم — نص درس «SUM وAVG مع NULL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «SUM وAVG مع NULL»؟
سبب تجاهل AVG لقيم NULL وكيف يغير ذلك الإجابة المتوقعة في المقابلات تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «SUM وAVG مع NULL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- COUNT(*) مقابل COUNT(column) مقابل COUNT(DISTINCT)
- SUM وAVG مع NULL
- MIN وMAX والتجميع غير الرقمي
- التجميعات دون GROUP BY