دستور Having در SQL – از کاربرد تا نحوه استفاده به زبان ساده
- تفاوتهای بین WHERE و HAVING در SQL را یاد میگیرید.
- نوشتن کوئری HAVING همراه با GROUP BY را میآموزید.
- میآموزید که چگونه HAVING را با توابع تجمعی ترکیب کنید.
- نحوه فیلتر کردن گروهها با استفاده از HAVING را یاد میگیرید.
- کاربرد توابع COUNT، AVG و MAX را در کوئری HAVING میشناسید.
- یاد میگیرید نتایج گروهبندیشده را با ORDER BY مرتب کنید.

عبارت HAVING در SQL

علاوه براین، از ماده HAVING در كوئری میتوان همراه با «توابع تجمعی» (Aggregate Functions) مانند COUNT() , SUM() , AVG() و غیره استفاده كرد. درحالی كه عبارت WHERE را نمیتوان با توابع تجمعی استفاده كرد.
سینتكس دستور HAVING در SQL
بلاك كدی كه در ادامه آمده است موقعیت عبارت HAVING را بهصورت كلی در كوئری نشان میدهد.
همینطور كه میبینید عبارت HAVING بعد از همهی عبارتهای كلیدی به غیر از ORDER BY آمده است.
عبارت HAVING همراه با دستور GROUP BY
میتوانیم از عبارت HAVING همراه با دستور GROUP BY استفاده كنیم تا گروههایی از سطرها را تحت شرایط مشخص فیلتر كنیم. پس از اعمال «انبوهش» (Aggregation) بر روی دادهها از این دستور برای اعمال فیلتر روی مجموعه نتایج استفاده میشود.
مثال
فرض كنید جدولی به نام مشتریها CUSTOMERS با استفاده از كوئری زیر ایجاد كردهایم كه شامل نام، سن، آدرس، و درآمد مشتریان میشود. ستونها را به ترتیب به نامهای address ،age ،name و salary نامگزاری كردهایم. به كوئری زیر نگاه كنید.
الان با استفاده از عبارت INSERT بهصورتی كه در زیر آمده است مقادیری را درون جدول وارد كنید.
میتوانید در تصویر زیر جدولی را كه با استفاده از كدهای بالا ساخته شده، ببینید.
| SALARY | ADDRESS | AGE | NAME | ID |
| 2000 | Ahmedabad | 32 | Ramesh | 1 |
| 1500 | Delhi | 25 | Khilan | 2 |
| 2000 | Kota | 23 | Kaushik | 3 |
| 6500 | Mumbai | 25 | Chaitali | 4 |
| 8500 | Bhopal | 27 | Hardik | 5 |
| 4500 | Hyderabad | 22 | Komal | 6 |
| 10000 | Indore | 24 | Muffy | 7 |
الان درحال دستهبندی ركوردهای جدول CUSTOMERS بر اساس ستونهای آدرس ADDRESS و سن AGE هستیم و گروهها را با این شرط كه مقدار AGE كمتر از 25 باشد فیلتر میكنیم.
خروجی
خروجی تولید شده توسط كد بالا به شكل زیر است.
| MIN_SUM | AGE | ADDRESS |
|---|---|---|
| 2000 | 32 | Ahmedabad |
| 8500 | 27 | Bhopal |
عبارت HAVING همراه با دستور ORDER BY
مثال
كوئری كه در ادامه آمده است ركوردهای جدول CUSTOMERS را بر اساس سن AGE و آدرس ADDRESS دستهبندی میكند. سپس گروهها را به شرطی كه مقدار حقوق SALARY كمتر از 5000 باشد فیلتر میكند. در آخر نیز باقیمانده گروهها را بهصورت نزولی بر اساس كل حقوق هر گروه منظم میكند.
خروجی
نتایجی كه از كوئری بالا بهدست میآید در جدول زیر دیده میشود.
| TOTAL_SALARY | AGE | ADDRESS |
| 10000 | 24 | Indore |
| 8500 | 27 | Bhopal |
| 6500 | 25 | Mumbai |
دستور HAVING همراه با توابع تجمعی
عبارت WHERE در زمان کار همراه با «توابع تجمعی» (Aggregate Functions) خوب عمل نمیکرد. درنتیجه هنگام استفاده از تابعهای تجمعی باید بهجای عبارت WHERE، از عبارت Having استفاده کنیم. در ادامه این نوع خاص از توابع و روش استفاده از دستور HAVING به همراه بعضی از این تابعها را بررسی کردهایم.
تابع تجمعی در SQL چیست؟
تابع تجمعی به نوعی از تابع میگویند که روی چندین داده مختلف محاسباتی انجام میدهد و به عنوان خروجی فقط یک مقدار برمیگرداند. SQL توابع تجمعی زیادی ارائه داده است که به عنوان مثال میتوان به مواردی مانند گزینههای فهرست شده در زیر اشاره کرد.
- Max
- Min
- Sum
- Count
- Avg
- و غیره

در ادامه به بررسی بعضی از این توابع میپردازیم. بررسی خود را با تابع Count() شروع خواهیم کرد.
دستور HAVING به همراه تابع COUNT
میتوان از دستور HAVING در SQL همراه با تابع COUNT() برای فیلتركردن گروهها بر اساس سطرهایی كه دارند استفاده كرد.
مثال
كوئری كه در ادامه آمده است ركوردهای جدول CUSTOMERS را بر اساس ستون سن AGE مشتریها دستهبندی میكند و دادهها را از دستههایی که بیش از دو عضو دارند میخواند.
خروجی
خروجی زیر از اجرای کد بالا بر روی جدول مشتریان بهدست میآید.
Query OK, 0 rows affected (0.02 sec)دستور HAVING به همراه تابع AVG
دستور HAVING در SQL به همرا تابع AVG() نیز قابل استفاده است. از ترکیب این عبارتها برای فیلتر کردن گروهها بر اساس مقدار میانگین در ستون خاصی استفاده میکنند.
مثال
در مثال بعد میخواهیم دادههای شهرهایی را فراخوانی کنیم که مشتریان آن شهرها دارای میانگین حقوق بالاتر از ۵۲۴۰ هستند. به کوئری که در ادامه آمده نگاه کنید.
خروجی
مجموعه نتایجی که بهصورت جدول در زیر میبینید بر اثر اجرای کوئری بالا از جدول مشتریها ایجاد شدهاند.
| AVG_SALARY | ADDRESS |
| 6500 | Mumbai |
| 8500 | Bhopal |
| 10000 | Indore |
دستور HAVING به همراه تابع MAX
تابع MAX() یکی دیگر از توابع تجمعی است که همراه با دستور HAVING در SQL مورد استفاده قرار میگیرد. از این تابع برای فیلتر کردن گروهها بر اساس مقدار ماکزیمم از ستون خاصی استفاده میشود.
مثال
به کمک تابع MAX() و دستور HAVING در SQL در مثالی که آوردهایم به دنبال استخراج شهرهایی از جدول مشتریها هستیم که بیشترین حقوق مشتریها در آنجا از ۵۲۴۰ بالاتر است. به کوئری آمده در پایین توجه کنید.
خروجی
مجموعهی نتایج ناشی از کوئری بالا بهصورت زیر خواهد بود.
| MAX_SALARY | ADDRESS |
| 6500 | Mumbai |
| 8500 | Bhopal |
| 10000 | Indore |
سوالات متداول
در این بخش به بررسی بعضی از سوالاتی میپردازیم که بیشتر از همه برای کاربران پیش آمدهاند و شاید برای شما هم مطرح شده باشند.
چه تفاوتی بین دستور WHERE و دستور HAVING در SQL وجود دارد؟
تفاوت اصلی بین عبارتهای HAVING و WHERE این است که عبارت WHERE به کاربران اجازه میدهد که دادهها را از سطرهای مشخصی از جدول بر اساس معیارهای تعیین شده فیلتر کند. در مقابل آن، عبارت HAVING به کاربران اجازه میدهد که دادهها را از بین گروهی از ردیفها در کوئری بر اساس شرطهای مشخص شده فیلتر کند. این شرطها شامل توابع تجمعی نیز میشوند.
آیا می توانم از عبارت HAVING بدون عبارت GROUP BY استفاده کنم؟
اگر از دستور HAVING در SQL بدون عبارت GROUP BY استفاده کنید، شرایط عبارت HAVING بر روی همه سطرهای واجد شرایط جستوجو اعمال میشود به عبارت دیگر، همه سطرهایی که شرایط جستوجو را تامین میکنند، یک گروه مجزا را تشکیل میدهند.

آیا می توانیم از عبارت های HAVING و WHERE همزمان باهم در یک کوئری استفاده کنیم؟
بله، قطعا میتوانید در همان کوئری که عبارت HAVING را بکاربردهاید، از عبارت WHERE نیز استفاده کنید. وقتی عبارت WHERE را در همان کوئری به کار میگیرید همیشه باید قبل از عبارت GROUP BY استفاده شود که به همین ترتیب همیشه قبل از دستور HAVING در SQL استفاده میشود. در نتیجه همیشه دادهها اول از همه با شرایط مربوط به عبارت WHERE فیلتر میشوند.
جمع بندی
به کمک عبارت HAVING و کلمه کلیدی GROUP BY میتوانیم دادههای پایگاه داده خود را در گروههای مختلفی دستهبندی کنیم. از این عبارت در پایگاههای داده بزرگ هم میتوان استفاده کرد. در موقعیتهایی که نمیتوانید از دستور HAVING استفاده کنید، احتمالا ناچار به استفاده از عبارت WHERE خواهید بود.
در این مطلب از مجله فرادرس با دستور HAVING در SQL آشنا شدیم و یاد گرفتیم که در پایگاه داده با استفاده از عبارت HAVING به جستوجو بپردازیم. فراموش نکنید برای بهدست آوردن دادههای مطلوب نظرتان، همینطور که در این مطلب دیدید، از عبارت HAVING باید حتما در بند GROUP BY کوئری استفاده کنید. برای پیدا کردن اطلاعات بیشتر درباره سایر دستورات مربوط به SQL میتوانید به مجله فرادرس مراجعه کنید.
بدون کد ۱۱۹۵ کلمه
مطالب مجله فرادرس را در جستجوی گوگل سریعتر ببینید













