دستور Having در SQL – از کاربرد تا نحوه استفاده به زبان ساده

۱۴۴ بازدید
آخرین به‌روزرسانی: ۱۶ اسفند ۱۴۰۲
زمان مطالعه: ۶ دقیقه
دستور Having در SQL – از کاربرد تا نحوه استفاده به زبان ساده

در این مطلب از مجله فرادرس به بررسی دستور Having در SQL خواهیم پرداخت. در SQL از کلمه کلیدی Having دقیقا بعد از عبارت GROUP BY استفاده می‌کنیم تا برای پایگاه داده بر اساس شرایط خود کوئری بنویسیم. مانند بقیه کلمات کلیدی، این عبارت داده‌ها را با توجه به شرایط خود انتخاب می‌کند و باقی داده‌ها را فیلتر می‌کند. کلمه کلیدی Having به این دلیل معرفی شد که عبارت WHERE در زمان کار با «توابع تجمعی» (Aggregate Functions) خوب عمل نمی‌کرد. درنتیجه وقتی از تابع‌های تجمعی استفاده می‌کنیم به‌جای عبارت WHERE باید از عبارت Having استفاده کنیم. عبارت Having کمک می‌کند که فرایند انبوهش با دقت بالاتری اتفاق بی‌افتد.

«انبوهش» (Aggregation) نام دیگری برای فرایند جمع و خلاصه‌سازی نقاط داده در یک داده مجزا است. برای نمونه می‌توان از فرایندهایی مانند محاسبه میانگین یا حداقل در مجموعه‌ای از داده‌ها نام برد. بعضی وقت‌ها نیز، انبوهش مجموعه‌ای از داده‌ها به داده خاصی تبدیل می‌شود که کاربردی ندارد. برای مثال فرض کنیم درحال بررسی رفتارهای مربوط به خرید در فروشگاه خود هستید و مشتریان فروشگاه، ترکیبی از دو دسته دانش‌آموزان ضعیف و اساتید ثروتمند هستند. در این شرایط، اگر رفتار هر گروه را به‌صورت جداگانه بررسی کنید اطلاعات بسیار با ارزش‌تری بدست خواهید آورد. به عبارت دیگر باید مبلغ پولی را که هزینه شده در نهایت جمع ببندید اما اطلاعات مربوط به این پول، باید با توجه به هر گروه از مشتریان به‌صورت جداگانه پردازش شود. مخلوط کردن یا انبوهش داده‌های همه مشتری‌ها اطلاعات کم ارزشی به شما خواهد داد.

عبارت HAVING در SQL

عبارت HAVING در SQL شبیه به عبارت WHERE است. هر دو برای فیلتر كردن سطرها در جدول بر اساس معیارهای مشخصی استفاده می‌شوند. عبارت HAVING برای فیلتر كردن سطرهایی كه گروه‌بندی شده‌اند استفاده می‌شود بجای اینكه سطرها را به‌صورت مجزا از هم فیلتر كند. این سطرها به وسیله دستور GROUP BY قبلا گروه‌بندی شده‌اند. بنابراین، عبارت HAVING همیشه در كوئری بعد از ماده GROUP BY می‌آید.

به همراه قهوه و دفترچه کاربر لپتاب نیز برروی میز در حالت روشن قراردارد

علاوه براین، از ماده HAVING  در كوئری می‌توان همراه با «توابع تجمعی» (Aggregate Functions) مانند COUNT()  , SUM()  , AVG()  و غیره استفاده كرد. درحالی كه عبارت WHERE  را نمی‌توان با توابع تجمعی استفاده كرد.

سینتكس دستور HAVING در SQL

كدی كه در پایین می‌بینید سینتكس پایه دستور HAVING در SQL است.

1SELECT column1, column2, aggregate_function(column)
2FROM table_name
3GROUP BY column1, column2
4HAVING condition;

بلاك كدی كه در ادامه آمده است موقعیت عبارت HAVING را به‌صورت كلی در كوئری نشان می‌دهد.

1SELECT
2FROM
3WHERE
4GROUP BY
5HAVING
6ORDER BY

همین‌طور كه می‌بینید عبارت HAVING بعد از همه‌ی عبارت‌های كلیدی به غیر از ORDER BY  آمده است.

عبارت HAVING همراه با دستور GROUP BY

می‌توانیم از عبارت HAVING همراه با دستور GROUP BY  استفاده كنیم تا گروه‌هایی از سطرها را تحت شرایط مشخص فیلتر كنیم. پس از اعمال «انبوهش» (Aggregation) بر روی داده‌ها از این دستور برای اعمال فیلتر روی مجموعه نتایج استفاده می‌شود.

مثال

فرض كنید جدولی به نام مشتری‌ها CUSTOMERS  با استفاده از كوئری زیر ایجاد كرده‌ایم كه شامل نام، سن، آدرس، و درآمد مشتریان می‌شود. ستون‌ها را به ترتیب به نام‌های address ،age ،name و salary نام‌گزاری كرده‌ایم. به كوئری زیر نگاه كنید.

1CREATE TABLE CUSTOMERS (
2   ID INT NOT NULL,
3   NAME VARCHAR (20) NOT NULL,
4   AGE INT NOT NULL,
5   ADDRESS CHAR (25),
6   SALARY DECIMAL (18, 2),
7   PRIMARY KEY (ID)
8);

الان با استفاده از عبارت INSERT  به‌صورتی كه در زیر آمده است مقادیری را درون جدول وارد كنید.

1INSERT INTO CUSTOMERS VALUES
2(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
3(2, 'Khilan', 25, 'Delhi', 1500.00),
4(3, 'Kaushik', 23, 'Kota', 2000.00),
5(4, 'Chaitali', 25, 'Mumbai', 6500.00),
6(5, 'Hardik', 27, 'Bhopal', 8500.00),
7(6, 'Komal', 22, 'Hyderabad', 4500.00),
8(7, 'Muffy', 24, 'Indore', 10000.00);

می‌توانید در تصویر زیر جدولی را كه با استفاده از كدهای بالا ساخته شده، ببینید.

SALARYADDRESSAGENAMEID
2000Ahmedabad32Ramesh1
1500Delhi25Khilan2
2000Kota23Kaushik3
6500Mumbai25Chaitali4
8500Bhopal27Hardik5
4500Hyderabad22Komal6
10000Indore24Muffy7

الان درحال دسته‌بندی ركوردهای جدول CUSTOMERS  بر اساس ستون‌های آدرس ADDRESS  و سن AGE  هستیم و گروه‌ها را با این شرط كه مقدار AGE  كمتر از 25  باشد فیلتر می‌كنیم.

1SELECT ADDRESS, AGE, MIN(SALARY) AS MIN_SUM 
2FROM CUSTOMERS 
3GROUP BY ADDRESS, AGE HAVING AGE > 25;

خروجی

خروجی تولید شده توسط كد بالا به شكل زیر است.

MIN_SUMAGEADDRESS
200032Ahmedabad
850027Bhopal

عبارت HAVING همراه با دستور ORDER BY

از عبارت ORDER BY  برای منظم كردن ركوردهای منتج شده توسط كوئری SELECT  بر پایه ستون‌های مشخص در کوئری استفاده می‌شود. عبارت ORDER BY  می‌تواند داده‌ها را به‌صورت صعودی یا نزولی منظم كند. با استفاده از عبارت ORDER BY  در كنار عبارت HAVING  می‌توانیم با نظم دلخواه خود، داده‌های گروه‌های فیلتر شده را منظم كنیم.

مثال

كوئری كه در ادامه آمده است ركوردهای جدول CUSTOMERS  را بر اساس سن AGE و آدرس ADDRESS دسته‌بندی می‌كند. سپس گروه‌ها را به شرطی كه مقدار حقوق SALARY  كمتر از 5000  باشد فیلتر می‌كند. در آخر نیز باقی‌مانده گروه‌ها را به‌صورت نزولی بر اساس كل حقوق هر گروه منظم می‌كند.

1SELECT ADDRESS, AGE, SUM(SALARY) AS TOTAL_SALARY 
2FROM CUSTOMERS 
3GROUP BY ADDRESS, AGE HAVING TOTAL_SALARY >=5000 
4ORDER BY TOTAL_SALARY DESC;

خروجی

نتایجی كه از كوئری بالا به‌دست می‌آید در جدول زیر دیده می‌شود.

TOTAL_SALARYAGEADDRESS
1000024Indore
850027Bhopal
650025Mumbai

دستور HAVING همراه با توابع تجمعی

عبارت WHERE در زمان کار همراه با «توابع تجمعی» (Aggregate Functions) خوب عمل نمی‌کرد. درنتیجه هنگام استفاده از تابع‌های تجمعی باید به‌جای عبارت WHERE، از عبارت Having استفاده کنیم. در ادامه این نوع خاص از توابع و روش استفاده از دستور HAVING به همراه بعضی از این تابع‌ها را بررسی کرده‌ایم.

تابع تجمعی در SQL چیست؟

تابع تجمعی به نوعی از تابع‌ ‌می‌گویند که روی چندین داده مختلف محاسباتی انجام می‌دهد و به عنوان خروجی فقط یک مقدار برمی‌گرداند. SQL توابع تجمعی زیادی ارائه داده است که به عنوان مثال می‌توان به مواردی مانند گزینه‌های فهرست شده در زیر اشاره کرد.

  • Max
  • Min
  • Sum
  • Count
  • Avg
  • و غیره

از این تابع‌ها اغلب به همراه عبارت‌های GROUP BY و HAVING در دستور SELECT استفاده می‌شود. همه توابع تجمعی در زمان محاسباتشان مقادیر NULL را نادیده می‌گیرند به غیر از تابع Count()  .

تصورات انتزاعی مدیر پایگاه داده درباره انوع گوره بندی توسط دستور Having در SQL

در ادامه به بررسی بعضی از این توابع می‌پردازیم. بررسی خود را با تابع Count() شروع خواهیم کرد.

دستور HAVING به همراه تابع COUNT

می‌توان از دستور HAVING در SQL همراه با تابع COUNT()  برای فیلتركردن گروه‌ها بر اساس سطرهایی كه دارند استفاده كرد.

مثال

كوئری كه در ادامه آمده است ركوردهای جدول CUSTOMERS  را بر اساس ستون سن AGE  مشتری‌ها دسته‌بندی می‌كند و داده‌ها را از دسته‌هایی که بیش از دو عضو دارند می‌خواند.

1SELECT AGE, COUNT(AGE) 
2FROM CUSTOMERS GROUP BY AGE HAVING COUNT(age) > 2;

خروجی

خروجی زیر از اجرای کد بالا بر روی جدول مشتریان به‌دست می‌آید.

Query OK, 0 rows affected (0.02 sec)

دستور HAVING به همراه تابع AVG

دستور HAVING در SQL به همرا تابع AVG()  نیز قابل استفاده است. از ترکیب این عبارت‌ها برای فیلتر کردن گروه‌ها بر اساس مقدار میانگین در ستون خاصی استفاده می‌کنند.

مثال

در مثال بعد می‌خواهیم داده‌های شهرهایی را فراخوانی کنیم که مشتریان آن شهرها دارای میانگین حقوق بالاتر از ۵۲۴۰ هستند. به کوئری که در ادامه آمده نگاه کنید.

1SELECT ADDRESS, AVG(SALARY) as AVG_SALARY 
2FROM CUSTOMERS 
3GROUP BY ADDRESS HAVING AVG(SALARY) > 5240;

خروجی

مجموعه نتایجی که به‌صورت جدول در زیر می‌بینید بر اثر اجرای کوئری بالا از جدول مشتری‌ها ایجاد شده‌اند.

AVG_SALARYADDRESS
6500Mumbai
8500Bhopal
10000Indore

دستور HAVING به همراه تابع MAX

تابع MAX()  یکی دیگر از توابع تجمعی است که همراه با دستور HAVING در SQL مورد استفاده قرار می‌گیرد. از این تابع برای فیلتر کردن گروه‌ها بر اساس مقدار ماکزیمم از ستون خاصی استفاده می‌شود.

مثال

به کمک تابع MAX()  و دستور HAVING در SQL در مثالی که آورده‌ایم به دنبال استخراج شهرهایی از جدول مشتری‌ها هستیم که بیشترین حقوق مشتری‌ها در آنجا از ۵۲۴۰ بالاتر است. به کوئری آمده در پایین توجه کنید.

1SELECT ADDRESS, MAX(SALARY) as MAX_SALARY 
2FROM CUSTOMERS 
3GROUP BY ADDRESS HAVING MAX(SALARY) > 5240;

خروجی

مجموعه‌ی نتایج ناشی از کوئری بالا به‌صورت زیر خواهد بود.

MAX_SALARYADDRESS
6500Mumbai
8500Bhopal
10000Indore

سوالات متداول

در این بخش به بررسی بعضی از سوالاتی می‌پردازیم که بیشتر از همه برای کاربران پیش آمده‌اند و شاید برای شما هم مطرح شده‌ باشند.

چه تفاوتی بین دستور 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 می‌توانید به مجله فرادرس مراجعه کنید.

بدون کد ۱۱۹۵ کلمه

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
tutorialspointdatacampfreeCodeCampsimplilearnshiksha
نظر شما چیست؟

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