دستور HAVING در SQL Server | نحوه استفاده، ترفندهای بهینه سازی و رفع خطاهای رایج

دستور HAVING در SQL Server | نحوه استفاده، ترفندهای بهینه سازی و رفع خطاهای رایج

نوشته شده توسط: تیم فنی نیک آموز
تاریخ انتشار: ۳۰ اردیبهشت ۱۴۰۳
آخرین بروزرسانی: ۲۷ خرداد ۱۴۰۳
زمان مطالعه: 10 دقیقه
۵
(۲)

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

دوره کوئری نویسی در SQL Server نیک آموز

دستور HAVING در SQL Server چیست؟

عبارت HAVING در SQL Server ، یک جزء مهم از زبان کوئری نویسی T-SQL محسوب می‌شود و به‌واسطه آن، امکان فیلترکردن داده‌های تجمعی (Aggregated Data) فراهم می‌شود. برخلاف عبارت WHERE که قبل از هر Grouping یا Aggregation، فیلترسازی تک تک سطرها را انجام می‌دهد، در دستور HAVING ، پس از فرآیند گروه‌بندی و تجمیع، به فیلترسازی گروه‌هایی از سطرها می‌پردازد. به همین دلیل، دستور HAVING به‌طور خاص برای اعمال شرط روی داده‌های تجمعی مفید است.

کاربردهای دستور HAVING در SQL Server

چند کاربرد دستور HAVING در SQL Server در ادامه بررسی می‌شوند:

  • فیلترسازی نتایج تجمعی: عبارت HAVING در SQL Server ، امکان فیلترکردن گروه‌هایی از سطرها را براساس توابع تجمعی مانند SUM، AVG، COUNT، MIN و MAX فراهم می‌کند. به‌عنوان مثال، شما می‌توانید با کمک دستور HAVING ، گروه‌هایی با مجموع فروش بالاتر از یک مقدار آستانه مشخص را فیلتر کنید.
  • خلاصه‌سازی داده: با ترکیب دستور HAVING در SQL Server به‌همراه عبارت GROUP BY، می‌توانید داده‌ها را خلاصه‌سازی کرده و گروه‌ها را براساس معیارهای مشخصی فیلتر کنید. این عمل به‌منظور تهیه گزارش‌ها و تحلیل ترندهای مربوط به دیتا مفید است.
  • شناسایی ناهنجاری‌ها: عبارت HAVING می‌تواند به شناسایی ناهنجاری‌ها (Anomalies) یا داده‌های پرت (Outlier Data) در داده‌های تجمعی کمک کند. برای مثال، می‌توان از HAVING برای پیداکردن گروه‌هایی با مقادیر بالا یا پائین غیرمعمول نسبت به سایر داده‌های مجموعه استفاده کنید.

 

کاربردهای دستور HAVING در SQL Server

 

تفاوت بین WHERE و HAVING

تفاوت عبارات WHERE و HAVING در SQL Server ، زمان‌بندی و محدوده عملکرد آن‌ها است. عبارت WHERE را که در این مقاله بررسی کرده‌ایم، داده‌های خام پیش از خلاصه‌سازی، فیلتر می‌شوند. این عبارت براساس شروط تعیین‌شده، تک تک ردیف‌ها را پیش از هر گروه‌بندی یا تجمیع، فیلترسازی و روی مجموعه داده اصلی عمل می‌کند. در حالی که عبارت HAVING ، این گروه‌های ردیف‌ها را پس از فرآیند Grouping و Aggregation فیلتر می‌کند؛ به طوری که این عبارت پس از اعمال GROUP BY، روی مجموعه نتیجه اعمال شود. به عبارت دیگر، در حالی که دستور WHERE برای فیلترکردن داده‌های خامِ قبل از خلاصه‌سازی به کار می‌رود، دستور HAVING در SQL Server برای فیلتر کردن داده‌های تجمعی یا گروه‌هایی از ردیف‌ها پس از خلاصه‌سازی یا گروه‌بندی آن‌ها مورد استفاده قرار می‌گیرد. این تمایز، نظارت دقیق‌تر بر تحلیل داده‌ها را ممکن می‌کند.

نحوه استفاده از دستور HAVING در SQL Server

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

  • شروع با عبارت SELECT: در وهله اول، یک عبارت SELECT بنویسید که در آن از توابع تجمعی برای اعمال محاسبات روی داده‌های گروه‌بندی‌شده استفاده شود.
  • افزودن عبارت GROUP BY: از عبارت GROUP BY به‌منظور تعیین ستون‌هایی استفاده کنید که براساس آن‌ها می‌خواهید داده‌ها گروه‌بندی شوند.
  • استفاده از HAVING برای فیلترینگ گروه‌ها: پس از عبارت GROUP BY، از دستور HAVING در SQL Server استفاده کنید. بدین شیوه، می‌توانید براساس شروط خاص، گروه‌های ایجادشده را فیلتر کنید. معمولاً این شروط، توابع تجمعی را شامل می‌شوند و می‌توان در آن‌ها از عملگرهای منطقی مانند AND ، OR و NOT استفاده کرد.
  • تعیین شروط فیلترسازی در HAVING: در دستور HAVING ، کاندیشن‌ها یا همان شروط فیلترینگ مدنظر را ذکر کنید. شما باید مطمئن شوید که شروط روی نتایج تجمعی اعمال می‌شوند و نه تک‌به‌تک ردیف‌های جدول.
  • مرتب‌سازی نتایج: درصورت نیاز، امکان استفاده از ORDER BY برای مرتب‌سازی مجموعه نتایج نهایی براساس یک ستون خاص وجود دارد.
  • اجرای کوئری: پس از تکمیل مراحل فوق، می‌توانید کوئری خود را اجرا کنید. در چنین شرایطی، شما باید نتایج فیلترشده براساس معیارهای تعیین‌شده در HAVING را مشاهده کنید.

برای درک اقدامات فوق، به مثال زیر توجه کنید:

 

SELECT 
    CategoryID,
    COUNT(ProductID) AS TotalProducts
FROM 
    Products
GROUP BY 
    CategoryID
HAVING 
    COUNT(ProductID) > 5;

 

 کوئری فوق برای یافتن دسته‌بندی‌های محصولات با حداقل ۵ محصول استفاده می‌شود. در این کوئری، Select کردن CategoryID از جدول Products انجام می‌شود. سپس با استفاده از تابع Count، تعداد محصولات هر Category شمرده شده و طبق CategoryID گروه‌بندی خواهند شد. درنهایت، با اعمال دستور Having در SQL Server به فیلترکردن نتایج گروه‌بندی‌شده می‌‌پردازیم. بدین شیوه، تنها Category هایی نمایش داده می‌شوند که مجموع تعداد محصولات آن‌ها، بزرگ‌تر از ۵ باشد.

برای درک بهتر، به خروجی حاصل از اجرای این کوئری توجه کنید:

 

نحوه استفاده از دستور HAVING در SQL Server

 

ترکیب HAVING با گروه بندی (GROUP BY)

ترکیب عبارات GROUP BY و HAVING در SQL Server رویکرد قدرتمندی برای گروه‌بندی داده‌ها در سطرهای خلاصه و سپس فیلترکردن آن گروه‌ها براساس شرط است. عبارت GROUP BY برای گروه‌بندی ردیف‌های موجود در نتیجه یک کوئری براساس یک یا چند ستون استفاده می‌شود. به بیان دیگر، این عبارت رکوردها را براساس مقادیر موجود در ستون‌های مشخص‌شده، دسته‌بندی و خلاصه‌سازی می‌کند. معمولاً GROUP BY همراه با توابع تجمعی مانند SUM ،AVG ، COUNT ، MIN و MAX به کار می‌رود. ازسوی دیگر، دستور HAVING در SQL Server ، مشابه یک فیلتر عمل می‌کند؛ برخلاف WHERE که در آن سطرها قبل از گروه‌بندی فیلتر می‌شوند، در HAVING ، فیلتر پس از گروه‌بندی اعمال خواهد شد.

تصور کنید باید مشخص شود که کدام تأمین‌کنندگان در لیست محصولات شما، بیش از ۳ محصول متفاوت ارائه کرده‌اند. برای دستیابی به این موضوع، می‌توان از کوئری زیر با استفاده از عبارات GROUP BY و HAVING استفاده کرد:

 

SELECT 
    SupplierID,
    COUNT(ProductID) AS NumberOfProducts
FROM 
    Products
GROUP BY 
    SupplierID
HAVING 
    COUNT(ProductID) > 3;

 

ترکیب HAVING با گروه‌بندی (GROUP BY)

 

نکات و ترفندهای حرفه ای برای بهینه سازی کوئری های HAVING

اگر شما فردی هستید که می‌خواهید در مسیر شغلی DBA و موفقیت در آن قرار بگیرید، بهینه‌سازی کوئری‌ها، به‌ویژه آن‌هایی که دارای Having هستند، به منظور بهبود کارایی حائز اهمیت است. در این بخش، به بررسی برخی از تکنیک‌ها و ترفندهای مناسب برای بهبود کارایی این کوئری‌ها می‌پردازیم.

  • استفاده از ایندکس گذاری (Indexing) مؤثر: اطمینان حاصل کنید که ستون‌های استفاده‌شده در GROUP BY ایندکس‌گذاری شده هستند. این کار می‌تواند با کاهش زمان لازم برای مرتب‌سازی و گروه‌بندی داده‌ها، فرآیند Grouping را به‌طور قابل‌توجهی سرعت ببخشد. علاوه‌براین، ایندکس گذاری برای ستون‌هایی که در عبارات SELECT ، GROUP BY و دستور HAVING در SQL Server استفاده می‌شوند، می‌تواند مفید باشد. با این حال، قبل از انجام این کار، لازم است مزایا و معایب را به‌طور کامل بررسی کنید.
  • فیلترینگ اولیه با WHERE: درصورت امکان، قبل از Grouping، با به‌کارگیری عبارت WHERE، سطرها را فیلتر کنید. کاهش تعداد آن‌ها در مراحل اولیه فرآیند، می‌تواند به کاهش کارهای مربوط به مراحل گروه‌بندی و HAVING شده منجر شود و درنتیجه، عملکرد را بهبود بخشد.
  • بهینه‌سازی توابع تجمعی: برخی از توابع تجمعی می‌توانند پرهزینه‌تر به حساب بیایند. به‌عنوان مثال، معمولاً (*)COUNT سریع‌تر از COUNT(column) است؛ زیرا برای مقادیر NULL بررسی انجام نمی‌دهد. از ساده‌ترین تابع تجمعی که نیازمندی‌های شما را برآورده می‌کند، استفاده کنید.
  • به حداقل‌رساندن ستون‌ها در GROUP BY: هرچه ستون‌های بیشتری را در یک GROUP BY قرار دهید، Grouping پیچیده‌تر می‌شود. بنابراین، فقط ستون‌های ضروری را برای گروه‌بندی درنظر بگیرید تا محاسبات، ساده‌تر و سریع‌تر شوند.
  • اجتناب از عبارات پیچیده در HAVING: عبارات و توابع پیچیده در دستور HAVING در SQL Server ممکن است سرعت کوئری را بکاهند. درصورت امکان، عبارات را ساده‌سازی کنید یا آن‌ها را در یک Subquery محاسبه کنید.
  • استفاده از Approximation Functions: در سناریوهایی که اعداد دقیق حیاتی نیستند، استفاده از توابع تقریبی می‌تواند به بهبود قابل توجه در عملکرد منجر شود.
  • بازنویسی و بهینه‌سازی کوئری‌ها: گاهی اوقات، بازنویسی کوئری‌ها می‌تواند عملکرد را بهبود دهد. به‌عنوان مثال، تقسیم یک کوئری پیچیده به کوئری‌های ساده‌تر و کوچک‌تر، می‌تواند مفید واقع شود.
  • مانیتورینگ و تحلیل عملکرد کوئری: با استفاده از ابزارهای پروفایلینگ ارائه‌شده توسط سیستم مدیریت پایگاه داده، به‌طور منظم، کوئری‌ها را تجزیه‌وتحلیل کنید تا درک کنید گلوگاه‌ها (Bottlenecks) در کجا رخ می‌دهند. Execution Plan ها را بررسی کنید تا متوجه شوید کوئری‌ها چگونه پردازش می‌شوند و عملیات ناکارآمدی را شناسایی کنید.
  • سخت‌افزار و پیکربندی: اطمینان پیدا کنید که پیکربندی پایگاه داده برای حجم کاری، بهینه‌سازی‌شده است. پارامترهایی مانند تخصیص حافظه، اندازه Buffer Pool و تنظیمات اجرای موازی (Parallel Execution) می‌توانند تأثیر بسزایی بر عملکرد داشته باشند. استفاده از منابع سخت‌افزاری مناسب نیز می‌توانند به بهبود عملکرد کوئری‌ها کمک کند.

درمجموع، با اجرای این استراتژی‌ها، می‌توانید عملکرد کوئری‌هایی که از دستور HAVING در SQL Server استفاده می‌کنند، بهینه‌سازی کنید و کارایی کلی عملیات دیتابیس را در سازمان بهبود دهید.

 

نکات و ترفندهای حرفه‌ای برای بهینه‌سازی کوئری‌های HAVING

 

رفع خطاهای رایج در استفاده از HAVING

در ادامه، به برخی از اشتباهات رایج در استفاده از دستور HAVING در SQL Server اشاره خواهد شد:

  • فراموش‌کردن عبارت GROUP BY: یکی از اشتباهات رایج، فراموش‌کردن عبارت GROUP BY قبل از HAVING است. از آنجایی که HAVING روی داده‌های گروه‌بندی‌شده اعمال می‌شود، درصورت عدم وجود GROUP BY، خطا رخ خواهد داد.
  • استفاده از Column Alias: ارجاع به Column Alias هایی در HAVING که در مرحله اجرای کوئری قابل‌دسترسی نیستند، می‌تواند به خطا منجر شود. مطمئن شوید که Column Alias ها در یک عبارت SELECT قبلی تعریف شده‌اند یا به جای آن‌ها از نام اصلی ستون استفاده کنید.
  • استفاده مستقیم از توابع تجمعی: استفاده مستقیم از توابع تجمعی در HAVING و بدون گروه‌بندی اولیه داده‌ها، می‌تواند نتایج غیرمنتظره یا خطا به‌همراه داشته باشد.

جمع بندی: دلایل استفاده از دستور HAVING در SQL Server

به‌واسطه دستور HAVING در SQL Server ، فیلترینگ و تجزیه‌وتحلیل پیشرفته داده‌ها انجام می‌شود. شما می‌توانید با درک عملکرد، کاربردها و روش استفاده از HAVING ، از کوئری‌ها به بهترین نحو و برای استخراج بینش‌های ارزشمند از داده‌ها بهره‌مند شوید.

چه رتبه ای می‌دهید؟

میانگین ۵ / ۵. از مجموع ۲

اولین نفر باش

title sign
دانلود مقاله
دستور HAVING در SQL Server | نحوه استفاده، ترفندهای بهینه سازی و رفع خطاهای رایج
فرمت PDF
7 صفحه
حجم 1 مگابایت
دانلود مقاله
title sign
معرفی نویسنده
تیم فنی نیک آموز
مقالات
294 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
تیم فنی نیک آموز
پروفایل نویسنده
title sign
معرفی محصول
title sign
دیدگاه کاربران

هر روز یک ایمیل، هر روز یک درس
آموزش SQL Server بصورت رایگان
همین حالا فرم زیر را تکمیل کنید
دانلود رایگان جلسه اول
نیک آموز علاوه بر آموزش، پروژه‌های بزرگ در حوزه هوش تجاری و دیتا انجام می‌دهد.
close-link
تا ۵۰% تخفیف، ثبت‌نام دوره‌های آنلاین و کارگاه‌های هیجان انگیز در الکامپ ۲۷ 
یادگیری را با تخفیف شروع کن!!
close-image