عبارت HAVING برای اعمال شرط در GROUP BY

عبارت HAVING کاربردی شبیه به WHERE دارد و برای اعمال شرط یا شروطی بر روی نتیجه خروجی GROUP BY استفاده می شود. با استفاده از عبارت WHERE ابتدا بر روی سطرهای خروجی یک شرط را اعمال می کنیم تا سطرهای برای نمایش داده شدن در خروجی فیلتر شوند.

پس از فیلتر کردن خروجی توسط عبارت WHERE نوبت به گروه بندی داده ها بر اساس یک سطر می شود که شامل داده های تکراری است. مثلا شماره یا شناسه دپارتمان که تا به حال توضیح داده ایم. حال به طور مثال تعداد کارمندان هر دپارتمان را داریم و می خواهیم بدانیم کدام دپاتمان ها به طور مثال بیش از ۴۰ کارمند دارند. در این زمان عبارت HAVING به کار خواهد آمد.

مثالشناسه کاربری و بیشترین میزان حقوق به ازای هر دپارتمان نشان دهید به طوری که بیشترین مقدار حقوق کمتر از ۱۰۰۰ باشد.

چون می خواهیم بیشترین حقوق را بدست آوریم، پس باید از تابع ()MAX استفاده کنیم و چون خواسته شده بیشترین حقوق را به ازای هر دپارتمان پیدا کنیم، پس باید از ستون department_id جلوی عبارت GROUP BY استفاده شود. اما می خواهیم آن خروجی هایی را پیدا کنیم که بیشترین حقوق در آنها کمتر از ۱۰۰۰ دلار باشد، پس باید شرط COUNT(salary) < 10000 را در جلوی عبارت HAVING استفاده کنیم.

مثالنام شغل و مجموع حقوق را به ازای تمامی مشاغل بدست آورید به طوری که نام شغل شامل کلمه REP نمی شود و مجموع حقوق برای هر شغل نیز بیشتر از ۱۳۰۰۰ دلار باشد. سپس خروجی را بر اساس مجموع حقوق مرتب کنید.

در مثال بالا اولا می خواهیم کلمه REP در نام مشاغل نباشد پس این شرط را ابتدا توسط عبارت WHERE اعمال می کنیم. حال تعدادی سطر داریم که می خواهیم بر ستون job_id مجموع میزان حقوق کارمندان هر شغل را باید پیدا کنیم، پس اولا از تابع ()SUM استفاده می کنیم و دوما نام ستون job_id را در جلوی عبارت GROUP BY می آوریم. در نهایت خروجی را بر اساس مجموع میزان حقو و توسط عبارت ORDER BY  به صورت صعودی مرتب کرده ایم.

پیدا کردن وجود مقادیر تکراری توسط GROUP BY

مثالبررسی کنید که آیا تمامی شناسه های کارمندان منحصر به فرد هستند یا نه

در شکل زیر که خروجی مثال و کوئری بالا است، عدد ۱ در زیر ستون Total در هر سطر به این معنی است که تنها یک شناسه کارمندی یا employee_id وجود دارد. به عبارت دیگر مثلا برای شناسه کارمندی 200 عدد ۲ در زیر ستون Total باشد، پس دو مرتبه تکرار شده است.

آیا به طور خاص در جدول hr.employees از نمونه اسکیما پایگاه داده اوراکل این ممکن است که ستون employee_id تکراری باشد؟ پاسخ خیر است زیرا در جدول hr.employees ستون employee_id کلید اصلی است و طبق ویژگی کلید اصلی غیر تکراری و منحصر به فرد است و همچنین مقدار NULL نمی تواند داشته باشد. اما کوئری بالا یک روش کلی برای پیدا کردن تکراری بودن مقدار یک ستون و به همین ترتیب پیدا کردن تعداد تکرارهای آن است.

مثالتکرار هر نام را تعیین کنید.

در مثال بالا گروه بندی کارمندان بر اساس نام آنها مشخص می شود. شکل زیر خروجی کوئری مثال بالا را نشان می دهد. همانطور که در خروجی می بینید نام David سه مربته و نام Alexander ۲ مرتبه و بقیه یک مرتبه تکرار شده اند.

مثالتعیین کنید که کدام نام ها بیشتر از یک بار تکرار شده اند.

مثالتعیین کنید که کدام نام ها بیشتر از یک بار تکرار شده اند.

در مثال بالا مجدد داده ها را بر اساس نام کارمندان دسته بندی کردیم ولی هدف این است که از داده های گروه بندی شده تنها آنهایی را انتخاب کنیم که مقدار آنها بزرگتر از عدد یک باشد. به طور مثال و با توجه به شکل بالا، خروجی این کوئری نام های David و Alexander خواهد بود.