0Pricing
SQL Interview Prep · درس

عد المجموعات وتصفيتها

العثور على المجموعات التي تحقق حدًا معينًا، مثل سؤال العملاء الذين لديهم أكثر من N طلبات

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

أكثر أسئلة التجميع شيوعًا

يُعد سؤال «أوجد العملاء الذين لديهم أكثر من N طلبًا» مسألة GROUP BY النموذجية في المقابلات. وتظهر تنويعاته باستمرار: المنتجات التي بيعت أكثر من X مرة، والأقسام التي تضم Y موظفًا على الأقل، والأيام التي تجاوزت Z من عمليات تسجيل الدخول.

كل هذه الأسئلة تتبع النمط نفسه: جمّع، ثم احسب، ثم صفِّ المجموعات باستخدام HAVING.

الخطوة الأولى: احسب العدد لكل مجموعة

ابدأ بعدّ الصفوف داخل كل مجموعة. اجمع حسب المفتاح الذي يحدد «العميل» أو «المنتج»، ثم طبّق COUNT(*).

ينتج عن ذلك صف واحد لكل مجموعة يوضح حجمها. لم تُجرِ التصفية بعد، بل تقيس حجم كل مجموعة فقط.

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;

الخطوة الثانية: صفِّ باستخدام HAVING

أبقِ الآن على المجموعات التي تحقق العتبة فقط. فالشرط يعتمد على قيمة تجميعية، ولذلك يجب أن يكون في HAVING وليس في WHERE.

اقرأها هكذا: «جمّع الطلبات حسب العميل، ثم أبقِ العملاء الذين يتجاوز عدد طلباتهم خمسة». وهذه هي الإجابة الكاملة عن السؤال التقليدي.

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;

العدد المميز مقابل العدد الكلي

انتبه إلى صياغة السؤال. يحتاج سؤال «العملاء الذين طلبوا أكثر من 3 منتجات مختلفة» إلى COUNT(DISTINCT product_id)، وليس إلى COUNT(*).

  • تحسب COUNT(*) عدد الصفوف في المجموعة.
  • تحسب COUNT(DISTINCT col) عدد القيم الفريدة غير NULL.

يُدخل المحاورون كلمتي «مختلفة» أو «فريدة» في السؤال لاختبار ما إذا كنت ستستخدم DISTINCT.

SELECT customer_id, COUNT(DISTINCT product_id) AS distinct_products
FROM orders
GROUP BY customer_id
HAVING COUNT(DISTINCT product_id) > 3;

التصفية حسب SUM بدلًا من COUNT

تتعامل البنية نفسها مع المجاميع. فسؤال «العملاء الذين أنفقوا أكثر من 1000 إجمالًا» يجمع حسب العميل ويصفّي باستخدام SUM(amount).

يمكن لأي دالة تجميعية أن تحدد شرط HAVING: ‏COUNT أو SUM أو AVG أو MAX أو MIN. ويساعدك التعرف على المقياس المذكور في السؤال على اختيار الدالة التجميعية التي يجب التصفية حسبها.

SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;

شروط متعددة للمجموعة

يمكن لـ HAVING دمج الشروط باستخدام AND وOR، بما في ذلك القيم التجميعية المختلفة. فسؤال «العملاء الذين لديهم أكثر من 5 طلبات AND متوسط طلباتهم يتجاوز 100» يستخدم عبارة HAVING واحدة.

يرجع كل شرط إلى دالته التجميعية الخاصة، وتُقيَّم جميع الشروط بعد التجميع. وهذا يوضح قدرتك على التعبير عن قواعد العمل المركبة بوضوح.

SELECT customer_id,
       COUNT(*) AS orders,
       AVG(amount) AS avg_order
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5 AND AVG(amount) > 100;

الجمع بين WHERE وHAVING

غالبًا ما تحتاج إلى تصفية الصفوف قبل عدّها. فسؤال «من بين طلبات هذا العام، أوجد العملاء الذين لديهم أكثر من 5 طلبات» يستخدم WHERE للتاريخ وHAVING للعدد.

تقلّص WHERE عدد الصفوف أولًا، ثم يُطبَّق التجميع وعتبة HAVING. ويُعد استخدام العبارتين بشكل صحيح في استعلام واحد مؤشرًا على المستوى المتوسط.

SELECT customer_id, COUNT(*) AS orders_this_year
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING COUNT(*) > 5;

العثور على التكرارات

هناك حالة قريبة من ذلك: «أوجد عناوين البريد الإلكتروني المكررة». اجمع حسب العمود الذي يُفترض أن يكون فريدًا، وأبقِ على المجموعات التي يتجاوز عددها واحدًا.

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

SELECT email, COUNT(*) AS times_seen
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

المجموعات التي تحقق عددًا محددًا تمامًا

لا تكون الحدود دائمًا «أكبر من». فعبارة «العملاء الذين لديهم طلب واحد بالضبط» تستخدم HAVING COUNT(*) = 1، بينما تستخدم عبارة «3 على الأقل» >= 3.

انتبه إلى كلمة الحد في صياغة السؤال: «أكثر من»، «على الأقل»، «بالضبط»، «أقل من». إذ تقابل كل عبارة عامل مقارنة مختلفًا، ويختبر المحاورون مدى دقتك في ذلك.

-- One-time customers
SELECT customer_id, COUNT(*) AS orders
FROM orders
GROUP BY customer_id
HAVING COUNT(*) = 1;

إرجاع المفاتيح فقط

أحيانًا يطلب السؤال المعرّفات المطابقة فقط، لا الأعداد، وغالبًا لاستخدامها في استعلام آخر. ما زلت تُجري التجميع والتصفية، لكنك تختار المفتاح وحده في SELECT.

يمكنك بعد ذلك تغليف هذا في استعلام فرعي باستخدام IN أو في عملية JOIN لجلب السجلات الكاملة لهؤلاء العملاء. ومعرفة هذا التركيب لمسة تدل على خبرة متقدمة.

SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5;

دليل المقابلة

في أي سؤال عن «مجموعات تحقق حدًا معينًا»، استعرض الخطوات الأربع بصوت عالٍ: (1) تحديد مفتاح التجميع، (2) اختيار مقياس التجميع، (3) تحديد عامل المقارنة من صياغة السؤال، (4) وضع عوامل تصفية الصفوف في WHERE وعامل تصفية التجميع في HAVING.

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

تحقق سريع

اختر الاستعلام الصحيح للسؤال.

مراجعة

النمط: جمّع حسب المفتاح، ثم أجرِ التجميع، ثم صفِّ المجموعات باستخدام HAVING. يحل هذا مسائل «أكثر من N من الطلبات»، و«الأعلى إنفاقًا»، والقيم المكررة، والعملاء الذين أجروا طلبًا لمرة واحدة.

  • استخدم COUNT(*) للصفوف، وCOUNT(DISTINCT col) للقيم الفريدة.
  • طابق عامل المقارنة مع صياغة السؤال.
  • ضع عوامل تصفية الصفوف في WHERE، وعوامل تصفية التجميع في HAVING.
  • استخدم المفتاح وحده في SELECT لتمريره إلى استعلام فرعي باستخدام IN أو إلى عملية JOIN.

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

هل درس «عد المجموعات وتصفيتها» مجاني؟

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

ماذا ستتعلم في «عد المجموعات وتصفيتها»؟

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

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

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

كم من الوقت يستغرق درس «عد المجموعات وتصفيتها»؟

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

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

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

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

  1. قاعدة GROUP BY لأعمدة SELECT
  2. HAVING مقابل WHERE
  3. التجميع حسب عدة أعمدة وتعبيرات
  4. عد المجموعات وتصفيتها
← العودة إلى SQL Interview Prep