📞 02166056460

دستور شرطی Having در sql

8 / 10
از 18 کاربر
بازگشت به لیست مقالات » | شنبه 2 آبان 1405 در ساعت 17 و 6 دقیقه | نظرات کاربران ( 6 )

دستور Having در SQL برای فیلتر کردن نتیجه گروه بندی و اعمال شرط روی مقادیر محاسبه شده با توابعی مانند SUM و COUNT استفاده می شود. اگر می خواهید فقط گروه هایی را ببینید که نتیجه محاسبه آنها از حد مشخصی بیشتر است، این دستور ابزار مناسبی است.

آموزش SQL

دستور Having در SQL چیست و چگونه از آن استفاده کنیم؟

آموزش فیلتر گروه ها، توابع تجمیعی و تفاوت Having با Where
۰۱

دستور Having در SQL چه کاربردی دارد؟

دستور Having در SQL برای افزودن شرط به نتیجه گروه بندی و فیلتر کردن گروه ها استفاده می شود. این دستور معمولا همراه با دستور Group By می آید و به شما اجازه می دهد نتیجه توابع تجمیعی را بررسی کنید؛ برای نمونه می توانید گروه هایی را انتخاب کنید که مجموع فروش آنها از یک مقدار بیشتر است.

در مقابل، دستور Where رکوردهای جدول را پیش از گروه بندی محدود می کند. به همین دلیل، اگر شرط شما به مقدار محاسبه شده ای مانند مجموع، میانگین یا تعداد رکوردهای هر گروه مربوط باشد، باید از Having استفاده کنید. این تفاوت، پایه درک ترتیب و کاربرد این دو دستور است.

۵ نکته مهم درباره دستور Having در SQL

۰۲

۱. تفاوت محل اجرای Where و Having را بشناسید

WHERE داده های خام را پیش از گروه بندی بررسی می کند؛ بنابراین می تواند رکوردهایی را که با شرط مورد نظر سازگار نیستند کنار بگذارد. سپس SQL رکوردهای باقی مانده را گروه بندی می کند. این روش زمانی مناسب است که بخواهید از ابتدا فقط داده های یک بازه زمانی، یک شهر یا یک وضعیت مشخص وارد محاسبه شوند.

HAVING پس از تشکیل گروه ها اعمال می شود و نتیجه گروه را می سنجد. فرض کنید می خواهید فروش هر محصول را محاسبه کنید، اما فقط محصولاتی را نمایش دهید که مجموع فروششان از یک حد بیشتر است. شرط روی مجموع فروش است، نه روی یک رکورد منفرد؛ پس Having انتخاب درست خواهد بود.

برای مثال، در گزارش دانش آموزان می توان ابتدا فقط نمره های یک نیم سال را با Where انتخاب کرد و سپس نام دانش آموزان را گروه بندی کرد. اگر در پایان بخواهید تنها دانش آموزانی را ببینید که مجموع نمره هایشان از ۲۵ بیشتر است، شرط نهایی را با Having می نویسید.

۰۳

۲. از Having برای شرط روی توابع تجمیعی استفاده کنید

توابع تجمیعی چند مقدار را به یک نتیجه برای هر گروه تبدیل می کنند. SUM مجموع را به دست می آورد، COUNT تعداد را محاسبه می کند، AVG میانگین می گیرد و توابع MIN و MAX کمترین و بیشترین مقدار را پیدا می کنند. خروجی این توابع معمولا برای شرط گذاری با Having بررسی می شود.

برای نمونه، مدیر فروش ممکن است بخواهد فقط مشتریانی را ببیند که تعداد سفارش هایشان از چند سفارش بیشتر است. در این حالت، تعداد سفارش ها برای هر مشتری محاسبه می شود و سپس Having گروه های کم تعداد را حذف می کند. همین الگو برای گزارش تعداد ثبت نام ها، مجموع نمره ها یا میانگین هزینه نیز قابل استفاده است.

نکته مهم این است که شرط را بر اساس نیاز گزارش انتخاب کنید. اگر هدف محدود کردن سطرهای ورودی به محاسبه است، Where را به کار ببرید؛ اما اگر هدف حذف گروه ها بر اساس نتیجه محاسبه است، Having مناسب است.

📊

مجموع

با SUM مجموع مقدارهای هر گروه را محاسبه کنید.

🎯

تعداد

با COUNT تعداد رکوردهای هر گروه را بررسی کنید.

📈

میانگین

با AVG میانگین مقدار هر گروه را به دست آورید.

💡

کمینه و بیشینه

با MIN و MAX حدود مقدارهای گروه را بسنجید.

۰۴

۳. ساختار درست کوئری را رعایت کنید

در یک کوئری متداول، ابتدا ستون ها و محاسبه مورد نیاز را در بخش SELECT مشخص می کنید، سپس جدول را در FROM معرفی می کنید. در صورت نیاز، Where رکوردهای ورودی را محدود می کند و Group By مشخص می کند گروه ها بر اساس کدام ستون ساخته شوند. بعد از آن Having گروه های نامطلوب را فیلتر می کند.

ترتیب نوشتن بخش های اصلی مهم است، زیرا هر بخش نقش متفاوتی دارد. داشتن شرط در بخش اشتباه ممکن است خطا ایجاد کند یا نتیجه ای متفاوت از گزارش مورد انتظار بدهد. درک این ترتیب کمک می کند کوئری را هم بهتر بنویسید و هم هنگام بررسی خطاها سریع تر علت را پیدا کنید.

ساختار کلی دستور شرطی Having در SQL به شکل زیر است. خط Where اختیاری است و تنها زمانی اضافه می شود که لازم باشد داده های اولیه پیش از گروه بندی محدود شوند.

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
ORDER BY column_name;
۰۵

۴. عبارت های انتخاب شده را با گروه بندی هماهنگ کنید

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

برای مثال، اگر گروه بندی بر اساس نام مشتری انجام شود، نمایش نام مشتری همراه با مجموع خریدهای او منطقی است. اما نمایش یک نشانی تصادفی از میان چند رکورد متعلق به همان مشتری، بدون قاعده مشخص، ممکن است در برخی پایگاه های داده خطا بدهد یا نتیجه نامطمئنی ایجاد کند. بنابراین بهتر است ستون های Select را پیش از اجرای کوئری بازبینی کنید.

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

۰۶

۵. شرط های چندگانه را با دقت ترکیب کنید

در Having می توانید چند شرط را با عملگرهای AND و OR ترکیب کنید. برای مثال، گزارش می تواند گروه هایی را نمایش دهد که مجموع مقدارشان از یک حد بیشتر و تعداد رکوردهایشان دست کم به مقدار دیگری رسیده باشد. پرانتزگذاری در شرط های پیچیده کمک می کند اولویت منطقی عبارت ها روشن بماند.

در کاربردهای واقعی بهتر است هر شرط را جداگانه آزمایش کنید و بعد آنها را ترکیب کنید. اگر گزارش نتیجه غیرمنتظره ای دارد، بررسی کنید که آیا شرط باید قبل از گروه بندی در Where باشد یا پس از گروه بندی در Having. توجه به این موضوع، از حذف ناخواسته داده ها جلوگیری می کند.

راهنمای استفاده از Having در یک مثال واقعی

۰۷

فیلتر کردن دانش آموزان بر اساس مجموع نمره

فرض کنید جدولی به نام Students دارید که نام دانش آموز و نمره های او را نگهداری می کند. ممکن است هر دانش آموز چند رکورد داشته باشد، چون هر رکورد مربوط به یک درس یا آزمون است. هدف این است که نمره های هر دانش آموز جمع شوند و فقط افرادی در خروجی بمانند که مجموع نمره هایشان بیشتر از ۲۵ باشد.

ابتدا Group By رکوردها را بر اساس نام دانش آموز دسته بندی می کند. سپس تابع Sum نمره های هر دسته را جمع می زند. در پایان Having نتیجه جمع را بررسی می کند و گروه هایی را که شرط را ندارند کنار می گذارد. این نمونه نشان می دهد چرا Where جایگزین مناسبی برای شرط روی مجموع نیست.

SELECT Name, SUM(Grade) AS TotalGrades
FROM Students
GROUP BY Name
HAVING SUM(Grade) > 25
ORDER BY Name;

در این کوئری، عبارت SUM(Grade) مقدار تجمیعی هر گروه را تولید می کند و شرط Having فقط گروه هایی را نگه می دارد که مجموعشان از ۲۵ بیشتر باشد. مرتب سازی با Order By در انتهای کوئری انجام می شود تا نتیجه بر اساس نام نمایش داده شود.

نکته مثال: در این مثال به جای Having نمی توان شرط SUM(Grade) > 25 را در Where قرار داد، زیرا Where پیش از محاسبه گروه ها اجرا می شود. برای شرط گذاری بر روی مقدارهای محاسبه شده در هر گروه، از دستور Group By و جمله شرطی Having در جای درست استفاده کنید.

تفاوت Where و Having در SQL

۰۸

هر دستور در کدام مرحله کاربرد دارد؟

مهم ترین تفاوت این دو دستور، مرحله ای است که شرط در آن اعمال می شود. Where سطرهای ورودی را فیلتر می کند و Having گروه های ساخته شده را بر اساس نتیجه تجمیع می سنجد. اگر این دو مرحله را از هم جدا کنید، انتخاب دستور مناسب ساده تر می شود.

در گزارش فروش، برای محدود کردن داده ها به سفارش های ثبت شده در یک بازه زمانی می توانید شرط تاریخ را در Where قرار دهید. پس از آن، سفارش ها بر اساس مشتری گروه بندی می شوند و Having می تواند مشتریانی را نگه دارد که مجموع خریدشان از حد تعیین شده بیشتر است. به این ترتیب، هر دستور مسئول بخش مشخصی از پردازش خواهد بود.

ویژگی Where Having
زمان استفاده پیش از گروه بندی پس از گروه بندی
موضوع شرط رکوردهای جدول گروه ها و نتیجه تجمیع
نمونه کاربرد انتخاب سفارش های یک شهر انتخاب مشتریان با مجموع خرید مشخص
توابع تجمیعی معمولا برای شرط روی نتیجه تجمیع مناسب نیست برای شرط روی SUM، COUNT و AVG کاربرد دارد
۰۹

چه زمانی هر کدام را انتخاب کنیم؟

اگر می خواهید پیش از محاسبه فقط بعضی از رکوردها وارد گزارش شوند، Where را انتخاب کنید. برای نمونه، می توانید رکوردهای مربوط به یک وضعیت خاص را نگه دارید و سایر رکوردها را از همان ابتدا کنار بگذارید. این کار باعث می شود گروه بندی بر پایه داده های مورد نیاز انجام شود.

اگر شرط به تعداد، مجموع یا میانگین هر گروه مربوط است، Having را به کار ببرید. در یک گزارش کاربردی ممکن است ابتدا فقط سفارش های پرداخت شده با Where انتخاب شوند، سپس مبلغ سفارش ها برای هر مشتری جمع شود و در آخر Having مشتریان دارای مجموع خرید بالاتر از حد تعیین شده را نمایش دهد.

اشتباهات رایج هنگام استفاده از Having

🚨

استفاده به جای Where

شرط مربوط به رکوردهای خام را پیش از گروه بندی در Where قرار دهید.

⚙️

فراموش کردن Group By

برای گزارش گروهی، ستون یا ستون های گروه بندی را مشخص کنید.

🎯

شرط نامرتبط

شرط Having را با هدف گزارش و خروجی تابع تجمیعی هماهنگ کنید.

۱۰

انتظار نتیجه از یک رکورد به جای یک گروه

Having برای تصمیم گیری درباره خروجی گروه هاست، نه برای فیلتر کردن یک رکورد منفرد. اگر شرطی مثل شهر برابر با یک نام مشخص دارید، آن را در Where بنویسید. سپس اگر گزارش شما به گروه بندی نیاز دارد، داده های باقی مانده را با Group By دسته بندی کنید و در صورت نیاز شرط نهایی را با Having اعمال کنید.

۱۱

حذف یا جابه جا کردن بخش Group By

در گزارش های گروهی، Group By مشخص می کند هر نتیجه به کدام دسته تعلق دارد. اگر گروه بندی با هدف گزارش همخوان نباشد، ممکن است تعداد ردیف ها یا مقدارهای تجمیعی نادرست به نظر برسند. قبل از افزودن Having مطمئن شوید ستون گروه بندی، واحد مورد نظر برای گزارش را نشان می دهد؛ مانند مشتری، محصول یا ماه.

۱۲

پیچیده کردن شرط بدون آزمایش مرحله ای

وقتی چند شرط و تابع تجمیعی را همزمان وارد کوئری می کنید، پیدا کردن علت نتیجه نادرست دشوارتر می شود. بهتر است ابتدا کوئری را با Select و Group By اجرا کنید، سپس شرط Having را اضافه کنید و در پایان مرتب سازی یا محدودیت های دیگر را اعمال کنید. این روش مرحله ای خطاهای منطقی را آشکارتر می کند.

مزایای استفاده از دستور Having

مزایای دستور Having

گزارش های گروهی دقیق تر

فیلتر نتیجه تجمیع در همان کوئری
۰۱
فیلتر هدفمند

انتخاب گروه های مرتبط

گروه های نامرتبط را از خروجی گزارش کنار بگذارید.

۰۲
تجمیع

شرط روی محاسبات

نتیجه مجموع، میانگین یا تعداد را بررسی کنید.

۰۳
گزارش

خروجی خواناتر

نتایج مهم را از میان گروه ها جدا کنید.

۰۴
انعطاف

ترکیب با شرط ها

چند شرط را برای انتخاب دقیق تر ترکیب کنید.

۰۵
سادگی

کاهش پردازش دستی

فیلتر گروه ها را مستقیما در کوئری انجام دهید.

۱۳

نتیجه گیری: چه زمانی از دستور Having در SQL استفاده کنیم؟

دستور Having در SQL زمانی کاربرد دارد که بخواهید گروه های ساخته شده با Group By را بر اساس خروجی یک تابع تجمیعی فیلتر کنید. شرط هایی مانند مجموع فروش، تعداد سفارش ها یا میانگین نمره در این دسته قرار می گیرند. در مقابل، برای محدود کردن رکوردها پیش از گروه بندی از Where استفاده کنید.

برای نوشتن کوئری دقیق، ابتدا مشخص کنید گزارش شما بر اساس چه چیزی گروه بندی می شود، سپس تابع تجمیعی مورد نیاز را انتخاب کنید و در نهایت شرط را در بخش درست قرار دهید. اگر هنوز در حال یادگیری مفاهیم پایگاه داده و طراحی سایت هستید، تمرین با مثال های کوچک و بررسی مرحله ای خروجی، درک کاربرد Having را آسان تر می کند.

سوالات متداول دستور Having در SQL

دستور Having در SQL چه کاری انجام می دهد؟

Having گروه های حاصل از Group By را بر اساس یک شرط فیلتر می کند. این شرط اغلب به نتیجه تابعی مانند SUM، COUNT یا AVG مربوط است.

تفاوت اصلی Where و Having چیست؟

Where رکوردهای ورودی را پیش از گروه بندی فیلتر می کند، اما Having پس از گروه بندی، گروه ها را بر اساس نتیجه تجمیع بررسی می کند.

آیا می توان بدون Group By از Having استفاده کرد؟

در بعضی پایگاه های داده می توان Having را بدون Group By و برای نتیجه تجمیعی کل مجموعه به کار برد، اما رفتار دقیق به سیستم پایگاه داده بستگی دارد. برای گزارش های گروهی، معمولا Having همراه Group By استفاده می شود.

آیا در شرط Having می توان از چند شرط استفاده کرد؟

بله. می توانید چند شرط را با AND یا OR ترکیب کنید. برای عبارت های پیچیده، استفاده از پرانتز کمک می کند ترتیب ارزیابی شرط ها روشن باشد.

آیا Having فقط با تابع SUM کار می کند؟

خیر. Having را می توان با توابع تجمیعی دیگری مانند COUNT، AVG، MIN و MAX نیز به کار برد؛ تابع مناسب به نوع گزارشی بستگی دارد که می خواهید تهیه کنید.

برای گزارش های گروهی، شرط را در جای درست قرار دهید

اگر شرط به رکورد خام مربوط است از Where استفاده کنید و اگر نتیجه گروه یا تابع تجمیعی را بررسی می کنید، Having را به کار ببرید.

مرور دستور Having ←
ارسال نظر و نظرات ثبت شده
سپهر :
2 0
خیلی مختصر و مفید و صریح و خوب بود! واقعا ازتون ممنونم. خیلی خوب و به نحو احسنت آموزش دادید.
زینب :
3 0
واقعا ممنونم، خیلی عالی بود.
باران :
2 0
سلام عالی بود ممنون
مسعود :
5 0
نکات مثبت بود فقط اگه اول تابع گفته میشد و مثال ملموس تر بود عالی بود
حسین محمدی مهر :
51 0
سلام واقعا جمع و جور رو خیلی قشنکگ توضیح دادین فقط کافیه که شخصی که اینارو میخونه یه آشنایی مختصری با SQL داشته باشه تا بتونه از مطالب استفاده کنه. فقط یه خواهشی از شما دارم که اگه ممکنه مثالهای بیشتری در مورد مطالبی که تو سایت گذاشتین بزارین. از سایت بسیار خوبی که ایجاد کردین نهایت تشکر رو از شما دارم با آرزوی موفقیت برای شما
محمدیان :
24 0
باعرض سلام وخسته نباشید میشه درمورد توابع درون ساخته ی SQLونمونه های ان بیشتر توضیح بدین؟ باتشکر از سایت بسیارعالیتون
مدیریت : حتما . در آینده مثال های پیشرفته ای در این زمینه خواهیم زد و در مقالاتی جدا در اختیارتون قرار میگیره
سایر مقالات
دستور Delete در sql دستور DELETE در SQL؛ آموزش حذف رکورد از جدول 💡آشنایی با حذف داده‌ها دستور DELETE در ...
دستور Update در sql دستور Update در SQL چیست و چه کاربردی دارد؟ 💡آشنایی با به روزرسانی داده ها دستور Update در ...
دستور Insert در sql دستور Insert در اسکیوال برای افزودن رکورد به جدول به کار می رود. در این راهنما با شیوه نوشتن دستور، ...
دستور مرتب سازی Order By در sql دستور ORDER BY در SQL چیست و چه کاربردی دارد؟ 💡مرتب سازی خروجی کوئری دستور ORDER BY در SQL ...
دستور Group By در sql آموزش SQL دستور GROUP BY در SQL؛ آموزش گروه بندی و مثال کاربردی یاد بگیرید داده ها را ...
دستور شرطی Having در sql دستور Having در SQL برای فیلتر کردن نتیجه گروه بندی و اعمال شرط روی مقادیر محاسبه شده با توابعی مانن ...
عملگر های And و Or در SQL آموزش SQL عملگرهای AND و OR در SQL؛ راهنمای ترکیب شرط ها با مثال های کاربردی، تفاوت AND و ...
دستور شرطی WHERE در sql دستور WHERE در SQL چیست و چه کاربردی دارد؟ 🔎فیلتر کردن نتیجه ها دستور WHERE در SQL برای تعی ...
دستور SELECT DISTINCT در sql دستور SELECT DISTINCT در SQL چیست و چه کاربردی دارد؟ 💡آشنایی با حذف تکرارها در پایگاه داده، ...
دستور SELECT در sql دستور SELECT در SQL چیست و چه کاربردی دارد؟ 💡آشنایی با بازیابی داده ها دستور SELECT در SQL ...
دسته بندی
جستجو
⏳ در حال پردازش...
لطفا صبر کنید