ما الفرق بين WHERE وHAVING عند تجميع البيانات؟

متقدمقراءة دقيقةآخر تحديث 2 أكتوبر 2026

SQL قواعد البيانات

الإجابة

تحدد WHERE الصفوف التي تدخل في التجميع، بينما تحدد HAVING المجموعات التي تظهر بعد حساب نتائج التجميع. هذا الفرق يؤثر في معنى الأعداد والمجاميع النهائية. إذا استبعدنا الكتب القصيرة باستخدام WHERE، فإن COUNT داخل كل تصنيف سيحسب الكتب المتبقية فقط، وليس جميع الكتب التي كانت موجودة في ذلك التصنيف.

بعد تكوين المجموعات باستخدام GROUP BY، يمكن كتابة شرط مثل HAVING COUNT(*) > 1 للاحتفاظ بالمجموعات التي تضم أكثر من صف. من الأخطاء الشائعة حساب عدد الصفوف قبل تطبيق WHERE عند توقع النتيجة. لتتبع الاستعلام، ابدأ بتحديد الصفوف المقبولة، ثم وزعها على المجموعات، ثم احسب الدالة لكل مجموعة، وأخيرًا اختبر شرط HAVING. هذا التسلسل يوضح دور كل جزء دون الخلط بين تصفية السجلات وتصفية ملخصاتها.

مثال

CREATE TABLE books_having_example (category VARCHAR(20), pages INT);
INSERT INTO books_having_example VALUES ('SQL', 80), ('SQL', 150), ('Web', 140), ('Web', 180);
SELECT category, COUNT(*) AS total FROM books_having_example
WHERE pages > 100 GROUP BY category HAVING COUNT(*) > 1;

باختصار: WHERE تصفي الصفوف قبل التجميع، وHAVING تصفي المجموعات بناءً على نتائجها.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما الصف الوحيد الذي يعيده الاستعلام التالي؟

CREATE TABLE books_having_quiz (category VARCHAR(20), pages INT);
INSERT INTO books_having_quiz VALUES ('SQL', 80), ('SQL', 150), ('Web', 140), ('Web', 180), ('Art', 90);
SELECT category, COUNT(*) AS total FROM books_having_quiz
WHERE pages > 100 GROUP BY category HAVING COUNT(*) > 1;