0Pricing
Coding Interview Prep · درس

COUNT(*) مقابل COUNT(column) مقابل COUNT(DISTINCT)

السؤال الشائع حول كيفية تعامل كل صيغة COUNT مع NULL والقيم المكررة

COUNT(*) مقابل COUNT(column) مقابل COUNT(DISTINCT) درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

السؤال الذي سيُطرح عليك

إذا أجريت مقابلة عمل حول SQL، فتوقّع أن يُطرح عليك هذا السؤال خلال الدقائق العشر الأولى: ما الفرق بين COUNT(*) وCOUNT(column) وCOUNT(DISTINCT column)؟

قد يبدو السؤال بسيطًا، لكن مسؤولي المقابلة يستخدمونه للتحقق مما إذا كنتم تفهمون حقًا كيفية تعامل دوال التجميع مع قيم NULL والتكرارات. فالإجابة الواثقة والدقيقة تشير إلى أنكم كتبتم استعلامات حقيقية، لا أنكم حفظتم الصياغة فقط.

في هذا الدرس، سنبني نموذجًا ذهنيًا متينًا حتى تتمكنوا من الإجابة فورًا وشرح السبب.

يحسب COUNT(*) الصفوف

يحسب COUNT(*) الصفوف. ولا يفحص قيم أي عمود على الإطلاق، لذا لا أهمية لقيم NULL. فإذا كان الجدول يحتوي على 100 صف، فسيُرجع COUNT(*) القيمة 100، بلا استثناء.

لا تعني النجمة هنا الضرب أو توسيع الأعمدة. إنها رمز خاص يعني «احسب كل صف يستوفي الشروط». وهذه هي الصيغة التي تستخدمونها عندما يكون السؤال ببساطة: «كم عدد السجلات؟»

SELECT COUNT(*) AS total_rows
FROM employees;

بيانات نموذجية للتحليل

لنربط كل شيء بجدول صغير واحد. تخيّلوا جدول employees يحتوي على عمود department يسمح بقيم NULL:

  • Alice، المبيعات
  • Bob، المبيعات
  • Carol، NULL
  • Dan، الهندسة
  • Eve، NULL

إجمالي ذلك هو 5 صفوف. تحتوي ثلاثة صفوف على قيمة للقسم (المبيعات، المبيعات، الهندسة)، ويحتوي صفّان على NULL. احتفظوا بهذه الأرقام في أذهانكم؛ سنحسب عدد صفوف هذا الجدول بثلاث طرق مختلفة.

يتجاهل COUNT(column) قيم NULL

يحسب COUNT(column) الصفوف التي تكون فيها قيمة ذلك العمود غير NULL فقط. ويتجاهل قيم NULL بالكامل.

في بياناتنا النموذجية، يُرجع COUNT(department) القيمة 3، وليس 5، لأن قيمتَي قسم تساويان NULL. وهذه أهم حقيقة في الدرس بأكمله: لا يحسب COUNT لعمودٍ ما قيم NULL مطلقًا.

SELECT COUNT(department) AS depts_present
FROM employees;
-- returns 3 on our sample data

مقارنة ما سبق

عند تطبيقهما على الجدول نفسه المكوّن من 5 صفوف:

  • COUNT(*) = 5 (كل الصفوف)
  • COUNT(department) = 3 (الأقسام غير NULL)

الفرق بينهما، أي 5 ناقص 3، يساوي عدد الأقسام التي قيمتها NULL. وهذه حيلة مفيدة في المقابلات: يعطيكم COUNT(*) - COUNT(col) عدد قيم NULL في ذلك العمود من دون كتابة عبارة WHERE منفصلة.

SELECT COUNT(*) - COUNT(department) AS null_departments
FROM employees;
-- returns 2

COUNT(DISTINCT column)

يحسب COUNT(DISTINCT column) عدد القيم الفريدة غير NULL. فهو يزيل التكرارات أولًا، ثم يتجاهل قيم NULL، ثم يحسب القيم المتبقية.

في بياناتنا، قيم القسم الفريدة هي المبيعات والهندسة، لذا يُرجع COUNT(DISTINCT department) القيمة 2. ولا تُحتسب قيمتا NULL، كما تُدمج قيمتا المبيعات المتطابقتان في قيمة واحدة.

SELECT COUNT(DISTINCT department) AS unique_depts
FROM employees;
-- returns 2

الثلاثة معًا

الصورة الكاملة في جدولنا المكوّن من 5 صفوف:

  • COUNT(*) = 5 — الصفوف
  • COUNT(department) = 3 — القيم غير NULL
  • COUNT(DISTINCT department) = 2 — القيم الفريدة غير NULL

إذا استطعتم تذكّر هذا الترتيب، مع مراعاة NULL ثم التكرارات، فقد استوعبتم المفهوم بأكمله. لاحظوا أن كل صيغة تُرجع قيمة أقل من أو تساوي القيمة التي تسبقها.

SELECT
  COUNT(*)                       AS rows_total,
  COUNT(department)              AS depts_present,
  COUNT(DISTINCT department)     AS unique_depts
FROM employees;

صيغة تطبيقية من مقابلة

غالبًا ما يصوغ مسؤولو المقابلة السؤال بطريقة أكثر تعقيدًا: «كم عدد الموظفين المعيّنين إلى قسم، وكم عدد الأقسام المختلفة الموجودة؟»

الجزء الأول هو COUNT(department)، لأن التعيين يعني أن القيمة غير NULL. أما الجزء الثاني فهو COUNT(DISTINCT department). إن إدراك صيغة COUNT التي تقابل كل عبارة هو المهارة التي يجري اختبارها تحديدًا.

SELECT
  COUNT(department)          AS assigned_employees,
  COUNT(DISTINCT department) AS distinct_departments
FROM employees;

COUNT مع شرط

سؤال متابعة شائع: احسب الصفوف التي تستوفي شرطًا فقط. ومن الحيل النظيفة والقابلة للنقل بين قواعد البيانات استخدام COUNT على تعبير CASE. وبما أن COUNT(column) يتجاهل قيم NULL، اجعل CASE يُرجع NULL للصفوف التي تريد استبعادها.

نحسب هنا موظفي المبيعات. يُرجع CASE قيمة لصفوف المبيعات فقط وNULL خلاف ذلك، ولذلك يحصي COUNT تلك الصفوف وحدها.

SELECT
  COUNT(CASE WHEN department = 'Sales' THEN 1 END) AS sales_count
FROM employees;
-- returns 2

أخطاء شائعة يجب تجنبها

انتبهوا إلى هذه الأخطاء التي قد يضعها مسؤولو المقابلة عمدًا:

  • افتراض أن COUNT(column) يساوي COUNT(*) — فهذا لا يحدث إلا عندما لا يحتوي العمود على أي قيم NULL.
  • الاعتقاد بأن COUNT(DISTINCT col) يتضمن NULL كقيمة فريدة واحدة — وهذا غير صحيح.
  • كتابة COUNT(1) على أمل أن يتجاهل قيم NULL — فهو يتصرف مثل COUNT(*) ويحسب جميع الصفوف.

اذكروا هذه النقاط استباقيًا في المقابلة لإظهار عمق فهمكم.

COUNT(1) وCOUNT(constant)

يسأل المرشحون غالبًا: أيهما أسرع، COUNT(*) أم COUNT(1)؟ الإجابة هي أنهما متطابقان دلاليًا — فكلاهما يحسب كل صف بصرف النظر عن قيم NULL — كما أن المُحسّنات الحديثة تتعامل معهما بالطريقة نفسها، لذلك لا يوجد فرق حقيقي في الأداء.

الثابت داخل COUNT(1) لا يكون NULL مطلقًا، ولذلك لا يُتخطّى أي صف. فضّلوا COUNT(*) للوضوح؛ فهي الصيغة الاصطلاحية.

SELECT COUNT(*) AS a, COUNT(1) AS b
FROM employees;
-- a and b are always equal

تحقق سريع

اختبروا نموذجكم الذهني على الجدول النموذجي.

خلاصة

أصبحتم الآن تتقنون السؤال الأكثر شيوعًا عن دوال التجميع:

  • تحسب COUNT(*) كل صف، بما في ذلك الصفوف التي تحتوي على NULL.
  • تحسب COUNT(column) القيم غير NULL فقط.
  • تحسب COUNT(DISTINCT column) القيم الفريدة غير NULL.
  • يعطيكم COUNT(*) - COUNT(col) عدد قيم NULL مجانًا.
  • تساوي COUNT(1) قيمة COUNT(*) — فلا تتجاهل NULL ولا يوجد فرق في السرعة.

قولوا ذلك بوضوح وادعموا إجابتكم بالسبب. التالي: كيفية تعامل SUM وAVG مع NULL.

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

هل درس «COUNT(*) مقابل COUNT(column) مقابل COUNT(DISTINCT)» مجاني؟

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

ماذا ستتعلم في «COUNT(*) مقابل COUNT(column) مقابل COUNT(DISTINCT)»؟

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

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

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

كم من الوقت يستغرق درس «COUNT(*) مقابل COUNT(column) مقابل COUNT(DISTINCT)»؟

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

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

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

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

  1. COUNT(*) مقابل COUNT(column) مقابل COUNT(DISTINCT)
  2. SUM وAVG مع NULL
  3. MIN وMAX والتجميع غير الرقمي
  4. التجميعات دون GROUP BY
← العودة إلى Coding Interview Prep