مطابق استاندارد رسمی SQL، عبارت Having تنها میتواند حاوی شرطهایی برای محدود کردن نتایج GROUP BY باشد. با این حال «MySQL 5.0.2» و جدیدتر به شما اجازه میدهد شرط خود را بدون داشتن GROUP BY با کمک Having بنویسید.
دو تفاوت اساسی میان Having و Where وجود دارد که میتواند در انتخاب هر یک موثر باشد.
۱- زمان اجرا:
Where در مرحلهی جستجوی ردیفها مورد ارزیابی قرار میگیرد. یعنی پایگاه داده در هنگامی که جدولها را پردازش میکند شرط مقابل Where را نیز در جستجو دخیل میکند.
Having تقریبا در پایان مراحل و پیش از آنکه نتایج به مشتری ارسال شود، نتایج یافته شده توسط Where را پاکسازی میکند.
۲- بهینهسازی
با توجه به آنچه در مورد زمان اجرای هر یک از عبارتهای Where و Having گفته شد، مشخص است که اعمال بهینهسازی بر روی Where امکانپذیر و در خصوص Having ناممکن است. زیرا Having نقشی در یافتن رکوردها ندارد و تنها کار حذف رکوردهای نادرست را انجام میدهد.
با توجه به دو تفاوت گفته شده، کاربردهای مختلفی نیز برای این دو دستور به وجود میآید.
یکی از بهترین مثالها برای استفاده از Having هنگامی است که میخواهید یک فیلد محاسباتی را که با ALIAS نامی برای آن برگزیدهاید، فیلتر کنید.
SELECT `fname`, `lanme`, ( `age` + 5 ) AS mod_age FROM myTable HAVING mod_age > 10 |
همان گونه که مشاهده میکنید در مثال بالا از ستون محاسباتی mod_age مقابل having استفاده کردهایم.
در حالت عادی برای آنکه همین کار را با کمک عبارت Where انجام دهیم دو راه زیر وجود دارد که شاید سبب کاهش خوانایی و افزایش پیچیدگی و حتی کاهش کارایی شوند:
SELECT * FROM ( SELECT `fname`, `lanme`, ( `age` + 5 ) AS mod_age FROM myTable ) AS sub_search WHERE mod_age > 10 |
SELECT `fname`, `lanme`, ( `age` + 5 ) AS mod_age FROM myTable WHERE ( `age` + 5 ) > 10 |
در شیوهی نخست، از یک sub-query برای یافتن تمام ردیفها و سپس از یک query برای یافتن موارد دلخواه استفاده کردیم.
در شیوهی دوم هم عبارت محاسباتی را دوباره در مقابل Where تکرار کردیم.
با توجه به آنچه در مورد خوانایی، کارایی، سازگاری و بهینهسازی گفته شد، بسته به موقعیت استفاده از Having یا Where میتواند توجیهپذیر باشد.
نکته جالبی بود . ممنون
سلام
ممنون از به اشتراک گذاشتن دانشتون
ممنون از راهنمایتون