الگوریتم اول

لطفا صبر کنید...

در SQL، دستور HAVING برای اعمال شرط‌گذاری روی گروه‌ها پس از انجام عملیات GROUP BY استفاده می‌شود. این دستور مشابه WHERE است، با این تفاوت که WHERE برای فیلتر کردن داده‌ها قبل از گروه‌بندی استفاده می‌شود، در حالی که HAVING برای فیلتر کردن گروه‌های داده بعد از گروه‌بندی و اعمال توابع جمعی (مثل COUNT، SUM، AVG، MIN، MAX) به کار می‌رود.

ساختار کلی دستور HAVING:

SELECT ستون1, ستون2, ..., تابع جمعی(ستون)
FROM جدول
WHERE شرایط (اختیاری)
GROUP BY ستون1, ستون2, ...
HAVING شرط_گروه‌بندی;

در اینجا:

  • WHERE (اختیاری): برای فیلتر کردن داده‌ها قبل از گروه‌بندی.
  • GROUP BY: برای گروه‌بندی داده‌ها بر اساس یک یا چند ستون.
  • HAVING: برای اعمال شرط روی گروه‌ها پس از گروه‌بندی و اعمال توابع جمعی.

1. مقایسه HAVING و WHERE:

  • WHERE برای فیلتر کردن رکوردها قبل از گروه‌بندی است.
  • HAVING برای فیلتر کردن گروه‌ها پس از گروه‌بندی است.

مثال:

فرض کنید جدولی به نام فاکتورها داریم که شامل ستون‌های شهر، تاریخ و قیمت است.

  • استفاده از WHERE برای فیلتر کردن رکوردها قبل از گروه‌بندی:

    SELECT شهر, تاریخ, SUM(قیمت) AS مجموع_قیمت
    FROM فاکتورها
    WHERE قیمت > 5000
    GROUP BY شهر, تاریخ;

    در اینجا، رکوردهایی که قیمت آن‌ها بیشتر از 5000 است قبل از گروه‌بندی فیلتر می‌شوند.

  • استفاده از HAVING برای فیلتر کردن گروه‌ها پس از گروه‌بندی:

    SELECT شهر, تاریخ, SUM(قیمت) AS مجموع_قیمت
    FROM فاکتورها
    GROUP BY شهر, تاریخ
    HAVING SUM(قیمت) > 10000;

    در اینجا، گروه‌هایی که مجموع قیمت‌های آن‌ها بیشتر از 10000 است پس از گروه‌بندی فیلتر می‌شوند.

2. استفاده از HAVING با توابع جمعی:

یکی از کاربردهای اصلی HAVING این است که می‌توان از آن برای اعمال شرط روی نتایج توابع جمعی استفاده کرد. به عنوان مثال، می‌توانیم گروه‌هایی را که مجموع یا میانگین مقادیر آن‌ها شرایط خاصی را دارند فیلتر کنیم.

مثال:

اگر بخواهیم تنها شهرهایی را که مجموع قیمت فاکتورها در آن‌ها بیشتر از 10000 باشد نمایش دهیم، می‌توانیم از HAVING استفاده کنیم:

SELECT شهر, SUM(قیمت) AS مجموع_قیمت
FROM فاکتورها
GROUP BY شهر
HAVING SUM(قیمت) > 10000;

در اینجا:

  • داده‌ها بر اساس شهر گروه‌بندی می‌شوند.
  • پس از گروه‌بندی، فقط شهرهایی که مجموع قیمت‌های آن‌ها بیشتر از 10000 است در نتایج نمایش داده می‌شوند.

3. چندین شرط در HAVING:

شما می‌توانید در HAVING چندین شرط را ترکیب کنید و از عملگرهای منطقی مانند AND و OR برای ترکیب آن‌ها استفاده کنید.

مثال:

اگر بخواهیم شهرهایی را پیدا کنیم که مجموع قیمت‌های آن‌ها بیشتر از 10000 باشد و تعداد فاکتورها در آن‌ها بیشتر از 5 باشد، می‌توانیم از HAVING با ترکیب چند شرط استفاده کنیم:

SELECT شهر, COUNT(*) AS تعداد_فاکتورها, SUM(قیمت) AS مجموع_قیمت
FROM فاکتورها
GROUP BY شهر
HAVING SUM(قیمت) > 10000 AND COUNT(*) > 5;

در اینجا:

  • ابتدا داده‌ها بر اساس شهر گروه‌بندی می‌شوند.
  • سپس گروه‌هایی که مجموع قیمت‌های آن‌ها بیشتر از 10000 و تعداد فاکتورها بیشتر از 5 باشد، انتخاب می‌شوند.

4. استفاده از HAVING با توابع غیر جمعی:

در بعضی موارد، می‌توانید از HAVING با توابع غیر جمعی نیز استفاده کنید، اما این معمولاً کمتر متداول است زیرا WHERE به طور معمول برای این منظور استفاده می‌شود. به هر حال، می‌توان در صورت نیاز از HAVING برای اعمال شرط روی داده‌های غیر گروه‌بندی‌شده نیز استفاده کرد.

مثال:

اگر بخواهیم تنها گروه‌هایی را نمایش دهیم که تاریخ آن‌ها برابر با یک تاریخ خاص باشد:

SELECT شهر, تاریخ, SUM(قیمت) AS مجموع_قیمت
FROM فاکتورها
GROUP BY شهر, تاریخ
HAVING تاریخ = '2025-03-01';

در اینجا:

  • داده‌ها ابتدا بر اساس شهر و تاریخ گروه‌بندی می‌شوند.
  • سپس فقط گروه‌هایی که تاریخ آن‌ها برابر با '2025-03-01' است در نتایج نمایش داده می‌شود.

5. نکات مهم در استفاده از HAVING:

  • از HAVING تنها پس از استفاده از GROUP BY می‌توان استفاده کرد.
  • در حالی که WHERE برای فیلتر کردن رکوردها قبل از گروه‌بندی به کار می‌رود، HAVING برای فیلتر کردن گروه‌ها پس از گروه‌بندی به کار می‌رود.
  • معمولاً از HAVING برای اعمال شرط بر روی نتایج توابع جمعی استفاده می‌شود.
  • در صورتی که نیازی به توابع جمعی نباشد، می‌توان از WHERE به جای HAVING استفاده کرد.

نتیجه‌گیری:

دستور HAVING در SQL برای اعمال شرط‌گذاری روی گروه‌ها پس از انجام گروه‌بندی با GROUP BY و اعمال توابع جمعی استفاده می‌شود. این دستور بسیار مفید است زمانی که می‌خواهید بر اساس نتایج توابع جمعی فیلتر کنید و تنها گروه‌هایی که شرایط خاصی دارند را در نتایج خود نشان دهید.