0Pricing
SQL Academy · درس

HAVING مقابل WHERE

ميّز بين HAVING التي ترشّح المجموعات وWHERE التي ترشّح الصفوف، وطبّقهما معًا بطريقة صحيحة في الاستعلام نفسه.

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

مرحلتا التصفية

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

مثال على WHERE

تعمل WHERE على تصفية الصفوف الخام، ولا يمكنها الوصول إلى الدوال التجميعية:

-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;

مثال على HAVING

تعمل HAVING على تصفية المجموعات، ويمكنها الرجوع إلى الدوال التجميعية:

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5;     -- only users with ≥ 5 orders

الجمع بين WHERE وHAVING

يمكن استخدام كلتيهما في الاستعلام نفسه:

SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;

لا تضعوا الدوال التجميعية في WHERE

ينفّذ المُخطِّط WHERE قبل التجميع، ولذلك لا تكون الدوال التجميعية متاحة بعد:

-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5         -- ERROR
GROUP BY user_id;

-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;

انقلوا الشروط إلى WHERE متى أمكن

تعمل WHERE قبل التجميع، ولذلك يدخل عدد أقل من الصفوف في عملية التجميع. استخدموا HAVING فقط للشروط التي لا يمكن التعبير عنها في WHERE.

-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);

-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;

ترتيب التنفيذ المنطقي

الترتيب المفاهيمي:

  1. FROM — اختيار الجداول وإجراء الربط
  2. WHERE — تصفية الصفوف
  3. GROUP BY — إنشاء المجموعات
  4. HAVING — تصفية المجموعات
  5. SELECT — إسقاط الأعمدة
  6. ORDER BY — الفرز
  7. LIMIT — جلب أعلى N من النتائج

HAVING من دون GROUP BY

يمكنكم استخدام HAVING من دون GROUP BY، إذ يصبح الجدول بأكمله مجموعة واحدة:

SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000;       -- prints only if total over 1M

الأسماء المستعارة في HAVING

تسمح بعض قواعد البيانات لـ HAVING بالرجوع إلى الأسماء المستعارة في SELECT؛ إذ يدعم PostgreSQL وMySQL ذلك، بينما لا يدعمه SQL القياسي. ولتحقيق أعلى قدر من قابلية النقل، كرّروا الدالة التجميعية:

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5;       -- portable
-- HAVING order_count >= 5  -- works in PG / MySQL

HAVING مع دوال تجميعية متعددة

استخدموا HAVING للشروط المركبة على الدوال التجميعية:

SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;

ملاحظة حول الأداء

لا يستطيع مرشح تجميعي في HAVING استخدام الفهارس بالطريقة التي يستطيع بها شرط WHERE على عمود. انقلوا ما يمكنكم نقله إلى WHERE.

مراجعة

WHERE = تصفية الصفوف. HAVING = تصفية المجموعات.

  • استخدموا الدوال التجميعية في HAVING فقط، وليس في WHERE
  • انقلوا الشروط إلى WHERE لتحسين السرعة
  • استخدموا كليهما عند الحاجة

تحقق سريع

تريدون المستخدمين الذين أجروا أكثر من 10 طلبات. ما العبارة التي تصفّي هؤلاء المستخدمين؟

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

هل درس «HAVING مقابل WHERE» مجاني؟

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

ماذا ستتعلم في «HAVING مقابل WHERE»؟

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

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

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

كم من الوقت يستغرق درس «HAVING مقابل WHERE»؟

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

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

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

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

  1. COUNT وSUM وAVG وMIN وMAX
  2. GROUP BY لعمود واحد أو عدة أعمدة
  3. HAVING مقابل WHERE
  4. أخطاء شائعة: قيم NULL في التجميعات
← العودة إلى SQL Academy