در MySQL، دستور HAVING برای فیلتر کردن نتایج گروهبندی شده که با GROUP BY ایجاد شدهاند، استفاده میشود.
در حالی که WHERE برای فیلتر کردن رکوردهای قبل از گروهبندی به کار میرود، HAVING به ما امکان میدهد شرایط خاصی را روی دادههای گروهبندیشده اعمال کنیم.
در این مقاله، مفهوم HAVING، تفاوت آن با WHERE، نحوه عملکرد و مثالهای کاربردی آن را بررسی خواهیم کرد.
۱. HAVING در MySQL چیست؟
🔹 HAVING زمانی استفاده میشود که بخواهیم شرایطی روی گروههای ایجاد شده توسط GROUP BY اعمال کنیم.
🔹 این دستور معمولاً همراه با توابع تجمعی مانند COUNT، SUM، AVG، MAX و MIN استفاده میشود.
🔹 WHERE قبل از GROUP BY عمل میکند، در حالی که HAVING بعد از GROUP BY اجرا میشود.
مثال ساده:
فرض کنید یک جدول سفارشات (orders) داریم که اطلاعات مربوط به مشتریان و مبلغ سفارشهای آنها را ذخیره میکند.
order_id | customer_id | amount |
---|---|---|
1 | 101 | 50000 |
2 | 102 | 30000 |
3 | 101 | 70000 |
4 | 103 | 40000 |
5 | 102 | 60000 |
✅ هدف: نمایش مشتریانی که مجموع خرید آنها بیش از 80,000 تومان باشد.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 80000;
✅ نتیجه:
customer_id | total_spent |
---|---|
101 | 120000 |
102 | 90000 |
🔹 توضیح:
- GROUP BY مشتریان را گروهبندی کرده است.
- SUM(amount) مجموع مبلغ خرید هر مشتری را محاسبه کرده است.
- HAVING فقط مشتریانی را نمایش داده که مجموع خرید آنها بیشتر از 80,000 تومان است.
۲. تفاوت بین HAVING و WHERE
ویژگی | WHERE | HAVING |
---|---|---|
عملکرد | فیلتر کردن رکوردها قبل از گروهبندی | فیلتر کردن نتایج بعد از گروهبندی |
استفاده با GROUP BY | نمیتواند روی توابع تجمعی اعمال شود | فقط برای گروهبندی استفاده میشود |
مثال کاربردی | WHERE amount > 50000 | HAVING SUM(amount) > 100000 |
مثال مقایسهای
✅ WHERE (فیلتر قبل از گروهبندی)
SELECT customer_id, amount
FROM orders
WHERE amount > 40000;
✅ HAVING (فیلتر بعد از گروهبندی)
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 80000;
🔹 WHERE: رکوردهایی را حذف میکند که مبلغ آنها کمتر از 40,000 تومان است.
🔹 HAVING: بعد از GROUP BY فقط گروههایی را نمایش میدهد که مجموع خریدشان بیشتر از 80,000 تومان است.
۳. نحوه استفاده از HAVING در MySQL
۳.۱. استفاده از COUNT در HAVING
✅ هدف: نمایش محصولاتی که بیش از ۵ بار سفارش داده شدهاند.
SELECT product_id, COUNT(order_id) AS total_orders
FROM orders
GROUP BY product_id
HAVING total_orders > 5;
۳.۲. استفاده از AVG در HAVING
✅ هدف: نمایش محصولاتی که میانگین قیمت آنها بیش از ۲۰۰,۰۰۰ تومان است.
SELECT product_id, AVG(price) AS average_price
FROM products
GROUP BY product_id
HAVING average_price > 200000;
۳.۳. استفاده از MAX و MIN در HAVING
✅ هدف: نمایش محصولاتی که بیشترین قیمت آنها بالای ۵۰۰,۰۰۰ تومان است.
SELECT product_id, MAX(price) AS max_price
FROM products
GROUP BY product_id
HAVING max_price > 500000;
۳.۴. استفاده از چندین شرط در HAVING
✅ هدف: نمایش مشتریانی که مجموع خریدشان بیش از ۸۰,۰۰۰ تومان باشد و تعداد سفارشهایشان بیشتر از ۱ سفارش باشد.
SELECT customer_id, COUNT(order_id) AS total_orders, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 80000 AND total_orders > 1;
✅ نتیجه:
customer_id | total_orders | total_spent |
---|---|---|
101 | 2 | 120000 |
102 | 2 | 90000 |
🔹 HAVING دو شرط را بررسی کرده است:
- مجموع خرید بیشتر از 80,000 تومان باشد.
- تعداد سفارشها بیشتر از ۱ سفارش باشد.
۴. استفاده از HAVING همراه با ORDER BY
✅ هدف: نمایش مشتریانی که بیش از ۸۰,۰۰۰ تومان خرید کردهاند و مرتبسازی آنها بر اساس مجموع خرید.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 80000
ORDER BY total_spent DESC;
✅ نتیجه: مشتریانی که بیشترین خرید را دارند، در ابتدا نمایش داده میشوند.
۵. نکات کلیدی در استفاده از HAVING
✔ HAVING همیشه بعد از GROUP BY استفاده میشود.
✔ HAVING برای فیلتر کردن گروههای ایجادشده توسط GROUP BY کاربرد دارد.
✔ HAVING با توابع تجمعی مانند COUNT، SUM، AVG، MAX و MIN استفاده میشود.
✔ برای فیلتر کردن دادهها قبل از گروهبندی، از WHERE استفاده کنید.
✔ میتوان از چندین شرط در HAVING استفاده کرد.
۶. نتیجهگیری
دستور HAVING در MySQL ابزاری قدرتمند برای فیلتر کردن دادههای گروهبندیشده است. این دستور همراه با GROUP BY و توابع تجمعی به ما امکان میدهد تا اطلاعاتی مانند میانگین خرید مشتریان، تعداد سفارشها، بیشترین فروش و… را بهصورت تحلیلشده دریافت کنیم.
نکات پایانی:
✅ HAVING فقط روی دادههای گروهبندیشده اعمال میشود.
✅ برای فیلتر کردن دادهها قبل از گروهبندی، از WHERE استفاده کنید.
✅ HAVING معمولاً همراه با COUNT، SUM، AVG، MAX و MIN استفاده میشود.
✅ برای فیلتر کردن چندین شرط در گروهبندیها، میتوان از AND و OR در HAVING استفاده کرد.
💡 با استفاده صحیح از HAVING، میتوانید گزارشهای دقیقتر و کاربردیتری از پایگاه دادههای خود تهیه کنید! 🚀