تفاوت و کاربرد عبارت‌های Having و Where در MySQL

نشان MySQL

مطابق استاندارد رسمی 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 می‌تواند توجیه‌پذیر باشد.

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

۳ دیدگاه برای تفاوت و کاربرد عبارت‌های Having و Where در MySQL

  1. صالح می‌گوید:

    نکته جالبی بود . ممنون

  2. سید داوود فامرینی می‌گوید:

    سلام

    ممنون از به اشتراک گذاشتن دانشتون

  3. شهرام می‌گوید:

    ممنون از راهنمایتون

پاسخ دادن به سید داوود فامرینی لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>