در MySQL، دستور GROUP BY برای گروهبندی دادهها بر اساس مقدارهای مشترک یک یا چند ستون استفاده میشود.
این دستور معمولاً همراه با توابع تجمعی (Aggregate Functions) مانند COUNT، SUM، AVG، MAX و MIN به کار میرود تا اطلاعات دستهبندیشده از جداول پایگاه داده را تحلیل و خلاصهسازی کند.
در این مقاله، مفهوم GROUP BY، نحوه استفاده از آن، مثالهای عملی و تفاوت آن با سایر روشهای فیلترگذاری داده را بررسی خواهیم کرد.
۱. GROUP BY در MySQL چیست؟
🔹 GROUP BY تمام رکوردهایی که مقدار یکسان در یک ستون مشخص دارند را در یک گروه قرار میدهد.
🔹 در هر گروه، میتوان توابع تجمعی را برای محاسبه دادهها استفاده کرد.
🔹 در خروجی هر گروه، فقط یک رکورد نمایش داده میشود.
مثال ساده:
فرض کنید یک جدول سفارشات (orders) داریم که اطلاعات مربوط به مشتریان و مبلغ سفارشهای آنها را ذخیره میکند.
order_id | customer_id | amount |
---|---|---|
1 | 101 | 50000 |
2 | 102 | 30000 |
3 | 101 | 70000 |
4 | 103 | 40000 |
5 | 102 | 60000 |
✅ هدف: محاسبه مجموع مبلغ سفارشهای هر مشتری
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id;
✅ نتیجه:
customer_id | total_spent |
---|---|
101 | 120000 |
102 | 90000 |
103 | 40000 |
🔹 توضیح:
- مشتری 101 در مجموع 120,000 تومان خرید کرده است.
- مشتری 102 در مجموع 90,000 تومان خرید کرده است.
- مشتری 103 در مجموع 40,000 تومان خرید کرده است.
- SUM(amount) مبلغ کل سفارشهای هر مشتری را محاسبه کرده است.
۲. نحوه استفاده از GROUP BY در MySQL
۲.۱. ساختار کلی دستور GROUP BY
SELECT column_name, AGGREGATE_FUNCTION(column_name)
FROM table_name
GROUP BY column_name;
✅ AGGREGATE_FUNCTION: یکی از توابع تجمعی مانند COUNT، SUM، AVG، MAX، MIN
۲.۲. استفاده از COUNT برای شمارش رکوردها در هر گروه
✅ هدف: شمارش تعداد سفارشهای ثبتشده توسط هر مشتری
SELECT customer_id, COUNT(order_id) AS total_orders
FROM orders
GROUP BY customer_id;
✅ نتیجه:
customer_id | total_orders |
---|---|
101 | 2 |
102 | 2 |
103 | 1 |
🔹 توضیح:
- مشتری 101 دو سفارش دارد.
- مشتری 102 دو سفارش دارد.
- مشتری 103 یک سفارش دارد.
۲.۳. استفاده از AVG برای محاسبه میانگین هر گروه
✅ هدف: میانگین مبلغ سفارشهای هر مشتری
SELECT customer_id, AVG(amount) AS average_amount
FROM orders
GROUP BY customer_id;
✅ نتیجه:
customer_id | average_amount |
---|---|
101 | 60000 |
102 | 45000 |
103 | 40000 |
🔹 توضیح:
- میانگین مبلغ سفارشهای مشتری 101 برابر 60,000 تومان است.
- میانگین مبلغ سفارشهای مشتری 102 برابر 45,000 تومان است.
- میانگین مبلغ سفارشهای مشتری 103 برابر 40,000 تومان است.
۳. استفاده از GROUP BY همراه با WHERE
میتوان از WHERE برای فیلتر کردن دادهها قبل از گروهبندی استفاده کرد.
✅ هدف: محاسبه مجموع مبلغ سفارشهای مشتریان، اما فقط برای سفارشهای بالای 40,000 تومان
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
WHERE amount > 40000
GROUP BY customer_id;
✅ نتیجه:
customer_id | total_spent |
---|---|
101 | 120000 |
102 | 60000 |
🔹 توضیح:
- فقط سفارشهایی که مبلغ آنها بیشتر از 40,000 تومان هستند در نظر گرفته شدهاند.
۴. استفاده از GROUP BY همراه با HAVING
✅ **WHERE قبل از GROUP BY عمل میکند، اما برای فیلتر کردن نتایج گروهبندی شده باید از HAVING استفاده کرد.
✅ هدف: نمایش مشتریانی که مجموع خرید آنها بیشتر از 80,000 تومان است.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 80000;
✅ نتیجه:
customer_id | total_spent |
---|---|
101 | 120000 |
102 | 90000 |
🔹 توضیح:
- HAVING فقط مشتریانی را نمایش میدهد که مجموع خرید آنها بیشتر از 80,000 تومان باشد.
۵. استفاده از GROUP BY برای چندین ستون
✅ هدف: نمایش مجموع مبلغ سفارشها، دستهبندی بر اساس مشتری و شهر
SELECT customer_id, city, SUM(amount) AS total_spent
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
GROUP BY customer_id, city;
✅ نتیجه:
customer_id | city | total_spent |
---|---|---|
101 | تهران | 120000 |
102 | مشهد | 90000 |
103 | اصفهان | 40000 |
🔹 توضیح:
- خروجی ابتدا بر اساس customer_id و سپس بر اساس city گروهبندی شده است.
۶. مقایسه GROUP BY با DISTINCT
✅ DISTINCT برای حذف رکوردهای تکراری استفاده میشود، اما GROUP BY برای دستهبندی و خلاصهسازی دادهها استفاده میشود.
✅ مثال:
SELECT DISTINCT customer_id FROM orders;
✅ نتیجه: فقط مشتریانی که حداقل یک سفارش دارند نمایش داده میشوند.
✅ اما در GROUP BY:
SELECT customer_id, COUNT(order_id) FROM orders GROUP BY customer_id;
✅ نتیجه: علاوه بر نمایش مشتریان، تعداد سفارشهای هر مشتری نیز نمایش داده میشود.
۷. نکات کلیدی در استفاده از GROUP BY
✔ GROUP BY همیشه در کنار توابع تجمعی مانند COUNT، SUM، AVG، MAX و MIN استفاده میشود.
✔ میتوان از WHERE برای فیلتر کردن دادهها قبل از گروهبندی و از HAVING برای فیلتر کردن نتایج گروهبندیشده استفاده کرد.
✔ میتوان چندین ستون را در GROUP BY قرار داد تا گروهبندی دقیقتری انجام شود.
✔ ORDER BY بعد از GROUP BY اجرا میشود تا دادههای گروهبندیشده مرتب شوند.
۸. نتیجهگیری
دستور GROUP BY در MySQL ابزاری قدرتمند برای دستهبندی و خلاصهسازی دادهها است. این دستور همراه با توابع تجمعی به ما امکان میدهد تا اطلاعات مفیدی از پایگاه داده استخراج کنیم، مانند تعداد سفارشهای هر مشتری، مجموع مبلغ خرید، میانگین فروش و سایر تحلیلهای آماری.
نکات پایانی:
✅ GROUP BY برای گروهبندی دادهها بر اساس مقدارهای مشترک یک ستون استفاده میشود.
✅ همراه با توابع تجمعی (COUNT، SUM، AVG و …) استفاده میشود.
✅ HAVING برای فیلتر کردن نتایج گروهبندیشده استفاده میشود.
💡 با یادگیری اصول GROUP BY، میتوانید گزارشهای دقیقتر و مفیدتری از پایگاه دادههای خود تهیه کنید! 🚀