GROUP BY و HAVING

ردیف‌ها را گروه‌بندی و برای هر گروه تجمیع کنی و تفاوت WHERE با HAVING را بدانی.

14 دقیقه مطالعه · 6 سؤال تمرینی · SQL از صفر: پرس‌وجو برای تحلیل داده

GROUP BY: یک خلاصه برای هر گروه

بدون GROUP BY کل جدول یک گروه است. با GROUP BY ردیف‌ها بر اساس مقدار یک (یا چند) ستون به گروه تقسیم می‌شوند و تجمیع برای هر گروه جدا حساب می‌شود:

SELECT city, COUNT(*) AS customers
FROM customers
GROUP BY city;

| city | customers | |---|---| | Tehran | 3 | | Isfahan | 1 | | Shiraz | 1 | | NULL | 1 |

قاعده‌ی طلایی: هر ستونی که در SELECT می‌آید یا باید در GROUP BY باشد یا داخل یک تابع تجمیعی. و نکته: NULL ها در یک گروه جمع می‌شوند؛ برای همین Pouya یک ردیف جدا دارد.

می‌توان با چند ستون گروه‌بندی کرد: GROUP BY status, customer_id به‌ازای هر ترکیب یک ردیف می‌دهد.

WHERE یا HAVING؟

گاهی می‌خواهیم گروه‌ها را فیلتر کنیم، مثلاً «فقط دسته‌هایی که حداقل ۲ کالا دارند». WHERE این کار را نمی‌تواند بکند، چون پیش از گروه‌بندی اجرا می‌شود و تابع تجمیعی هنوز وجود ندارد. برای فیلتر گروه‌ها HAVING داریم:

SELECT category, COUNT(*) AS n
FROM products
GROUP BY category
HAVING COUNT(*) >= 2;

| | WHERE | HAVING | |---|---|---| | فیلتر می‌کند | ردیف‌ها | گروه‌ها | | زمان اجرا | قبل از GROUP BY | بعد از GROUP BY | | تابع تجمیعی | نمی‌تواند داشته باشد | می‌تواند داشته باشد |

اگر شرط به ستون خام ربط دارد (مثل status = 'paid') آن را در WHERE بگذارید، چون زودتر ردیف‌ها را کم می‌کند و سریع‌تر است.

تمرین‌های این درس را حل کن (رایگان)