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 بگذارید، چون زودتر ردیفها را کم میکند و سریعتر است.