1. ما هو شرط HAVING؟
يُستخدم شرط HAVING في SQL لتطبيق الشروط على النتائج المجمعة بعد تجميع البيانات. يُستَخدم عادةً مع جملة GROUP BY ويعمل على تصفية البيانات بعد التجميع. باستخدام HAVING، يمكنك استخراج المجموعات التي تفي بمعايير محددة فقط.
على سبيل المثال، يمكن استخدام HAVING عندما تريد اختيار العملاء الذين يتجاوز إجمالي مبيعاتهم مبلغًا معينًا أو المجموعات التي يتجاوز متوسط درجاتها حدًا معينًا. على عكس جملة WHERE التي تُطبق الشروط على الصفوف الفردية قبل التجميع، يطبق HAVING الشروط على النتائج المجمعة بعد التجميع.
مثال على استخدام شرط HAVING
على سبيل المثال، الاستعلام التالي يستخرج العملاء الذين يتجاوز إجمالي مبيعاتهم 10,000 ين:
SELECT customer_id, SUM(sales) AS total_sales
FROM sales_table
GROUP BY customer_id
HAVING SUM(sales) > 10000;
يستخدم هذا الاستعلام دالة SUM لحساب إجمالي مبيعات كل عميل ويستخرج فقط الذين يتجاوز إجمالي مبيعاتهم 10,000 ين.
2. الصياغة الأساسية واستخدام شرط HAVING
الصياغة الأساسية لشرط HAVING هي كما يلي:
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING condition;
تقوم هذه الصياغة بتجميع البيانات باستخدام جملة GROUP BY وتصفية النتائج المجمعة بتحديد الشروط باستخدام جملة HAVING. على سبيل المثال، الاستعلام التالي يستخرج العملاء الذين قدموا على الأقل 5 طلبات من جدول الطلبات:
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders_table
GROUP BY customer_id
HAVING COUNT(order_id) >= 5;
هنا، تقوم دالة COUNT بحساب عدد الطلبات لكل عميل، ويتم تصفية فقط الذين لديهم 5 طلبات أو أكثر. 
3. أمثلة على تطبيق شرط HAVING
يُعد شرط HAVING أداة قوية للتحليل المتقدم للبيانات عندما يُدمج مع الدوال التجميعية. فيما يلي بعض الأمثلة المحددة.
المثال 1: التصفية حسب إجمالي المبيعات
لاستخراج المنتجات التي تتجاوز مبيعاتها 10,000 ين، استخدم دالة SUM كما يلي:
SELECT product_id, SUM(sales) AS total_sales
FROM products_table
GROUP BY product_id
HAVING SUM(sales) > 10000;
يحسب هذا الاستعلام إجمالي المبيعات لكل منتج ويستخرج تلك التي يتجاوز إجمالي مبيعاتها 10,000 ين.
المثال 2: التصفية حسب عدد الطلبات
لاستخراج العملاء الذين قدموا 10 طلبات أو أكثر:
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders_table
GROUP BY customer_id
HAVING COUNT(order_id) > 10;
يحسب هذا الاستعلام عدد الطلبات لكل عميل، ويستخرج فقط الذين قدموا 10 طلبات أو أكثر.
4. الفرق بين HAVING و WHERE
كلا من شرط HAVING وجملة WHERE يقومان بالتصفية، لكنهما يُطبقان في مراحل مختلفة.
فرق توقيت التطبيق
- جملة WHERE : تُطبق قبل التجميع، وتُصفي الصفوف الفردية.
- جملة HAVING : تُطبق بعد التجميع، وتُصفي النتائج المجمعة.
على سبيل المثال، عند دمج WHERE و HAVING في استعلام، قد تقوم أولاً بتصفية البيانات حيث تكون المبيعات على الأقل 1,000 ين باستخدام WHERE، ثم تستخدم HAVING لاستخراج المجموعات التي يتجاوز إجمالي مبيعاتها 5,000 ين.
SELECT customer_id, SUM(sales) AS total_sales
FROM sales_table
WHERE sales >= 1000
GROUP BY customer_id
HAVING SUM(sales) > 5000;
في هذا الاستعلام، تُجَمَّع البيانات التي تم تصفيتها بواسطة جملة WHERE باستخدام GROUP BY، ثم يُطبق شرط HAVING لاستخراج فقط العملاء الذين يتجاوز إجمالي مبيعاتهم 5,000 ين. 
5. ملاحظات هامة عند استخدام شرط HAVING
يجب أن يُستخدم مع الدوال التجميعية
نظرًا لأن شرط HAVING يُصفي النتائج المجمعة، يجب استخدامه مع الدوال التجميعية مثل SUM أو COUNT. بالنسبة للشروط التي تُطبق على الصفوف الفردية، تكون جملة WHERE أكثر ملاءمة.
استخدام الأسماء المستعارة
في جملة HAVING، يمكنك استخدام الأسماء المستعارة المحددة بـ AS في تعبيرات الشرط. على سبيل المثال، يمكنك تعيين اسم مستعار لإجمالي المبيعات واستخدامه كما يلي:
SELECT customer_id, SUM(sales) AS total_sales
FROM sales_table
GROUP BY customer_id
HAVING total_sales > 10000;
هذا الاستعلام يستخرج العملاء الذين يتجاوز إجمالي مبيعاتهم 10,000 ين.
6. الملخص: كيفية استخدام جملة HAVING
جملة HAVING هي أداة قوية لتصفية البيانات المجمعة بمرونة عن طريق تطبيق الشروط. إنها مفيدة بشكل خاص عند تحليل البيانات المجمعة مثل المبيعات أو عدد الطلبات، مما يتيح تحليلًا فعالًا للبيانات. من خلال فهم اختلافاتها عن جملة WHERE واستخدامهما معًا بشكل مناسب، يمكنك تعظيم مرونة استعلامات SQL الخاصة بك.

