- 1 1. المقدمة: نظرة عامة على GROUP BY
- 2 2. الاستخدام الأساسي لـ GROUP BY
- 3 3. دمج GROUP BY مع وظائف التجميع
- 4 4. التصفية باستخدام بند HAVING
- 5 5. استخدام GROUP BY مع ORDER BY
- 6 6. GROUP BY المتقدم: WITH ROLLUP
- 7 7. الفرق بين GROUP BY و DISTINCT
- 8 8. Optimizing GROUP BY Performance in MySQL
- 9 8. تحسين أداء GROUP BY في MySQL
- 9.1 1. Using Indexes
- 9.2 1. استخدام الفهارس
- 9.3 2. Adjusting Memory Settings
- 9.4 2. تعديل إعدادات الذاكرة
- 9.5 3. Simplifying Queries
- 9.6 3. تبسيط الاستعلامات
- 9.7 4. Version-Specific Features
- 9.8 4. ميزات خاصة بالإصدار
- 9.9 5. Using Query Cache
- 9.10 5. استخدام ذاكرة التخزين المؤقت للاستعلامات
- 9.11 6. Considering Partitioning
- 9.12 6. النظر في التجزئة
- 10 9. Summary: Effective Use of GROUP BY
- 11 9. الملخص: الاستخدام الفعّال لـ GROUP BY
1. المقدمة: نظرة عامة على GROUP BY
عند التعامل مع مجموعات بيانات كبيرة في قاعدة بيانات، أداة قوية لتجميع وتنظيم البيانات بكفاءة هي بند GROUP BY. يقوم GROUP BY بتجميع البيانات بناءً على عمود محدد ويُستخدم عند إجراء التجميعات لكل مجموعة. على سبيل المثال، إذا كنت تريد حساب إجمالي المبيعات لكل فئة منتج، فإن هذا البند يجعل من السهل استرجاع البيانات المرغوبة.
باستخدام بند GROUP BY، يمكنك تنظيم البيانات في تنسيق سهل القراءة وتطبيق وظائف التجميع (SUM، COUNT، AVG، إلخ) لتحليل أعمق.
2. الاستخدام الأساسي لـ GROUP BY
يقوم بند GROUP BY بتجميع البيانات حسب العمود المحدد ويجري التجميع لكل مجموعة. هذا يجعل من السهل إنشاء الملخصات والإحصاءات بناءً على الفئات أو الشروط.
الصيغة الأساسية
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name;
مثال
لحساب إجمالي المبيعات حسب فئة المنتج، يمكنك كتابة الاستعلام كالتالي:
SELECT product_category, SUM(sales_amount)
FROM sales
GROUP BY product_category;
يحسب هذا الاستعلام إجمالي المبيعات لكل فئة منتج.
نتيجة المثال
product_category | SUM(sales_amount) |
|---|---|
الإلكترونيات | 100,000 |
الطعام | ٥٠,٠٠٠ |
ملابس | 75,000 |

3. دمج GROUP BY مع وظائف التجميع
بتجميع GROUP BY مع وظائف التجميع، يمكنك تجميع البيانات وحساب الإحصاءات لكل مجموعة. تشمل وظائف التجميع الشائعة المستخدمة في MySQL:
- SUM() : تحسب مجموع البيانات الرقمية.
- COUNT() : تحسب عدد الصفوف.
- AVG() : تحسب المتوسط للبيانات الرقمية.
- MAX() : تسترد القيمة القصوى.
- MIN() : تسترد القيمة الدنيا.
استعلام عينة
للحصول على إجمالي المبيعات وعدد المبيعات حسب فئة المنتج:
SELECT product_category, SUM(sales_amount), COUNT(*)
FROM sales
GROUP BY product_category;
يسترد هذا الاستعلام إجمالي المبيعات وعدد المبيعات لكل product_category.
4. التصفية باستخدام بند HAVING
يطبق بند HAVING الشروط على البيانات المجموعة المُنشأة باستخدام GROUP BY. بخلاف بند WHERE، الذي يصفي الصفوف قبل التجميع، يصفي HAVING المجموعات بناءً على نتائج وظائف التجميع.
استعلام عينة
على سبيل المثال، لاستخراج الفئات التي يزيد إجمالي مبيعاتها عن 1000:
SELECT product_category, SUM(sales_amount)
FROM sales
GROUP BY product_category
HAVING SUM(sales_amount) > 1000;
يُرجع هذا الاستعلام فئات المنتجات التي يزيد إجمالي مبيعاتها عن 1000.

5. استخدام GROUP BY مع ORDER BY
بعد تجميع البيانات باستخدام GROUP BY، يمكنك ترتيب النتائج باستخدام بند ORDER BY. يرتب ORDER BY النتائج تصاعديًا (ASC) أو تنازليًا (DESC) بناءً على قيم الأعمدة المحددة.
استعلام عينة
لترتيب فئات المنتجات حسب إجمالي المبيعات تنازليًا:
SELECT product_category, SUM(sales_amount)
FROM sales
GROUP BY product_category
ORDER BY SUM(sales_amount) DESC;
يعرض هذا الاستعلام فئات المنتجات المرتبة من الأعلى إلى الأدنى مبيعات.
6. GROUP BY المتقدم: WITH ROLLUP
يضيف WITH ROLLUP صفًا ملخصًا يظهر الإجماليات العامة بالإضافة إلى إجماليات المجموعات. هذا مفيد بشكل خاص للتقارير والملخصات.
استعلام عينة
لعرض إجمالي المبيعات حسب المدينة والإجمالي العام:
SELECT city, SUM(sales_amount)
FROM sales
GROUP BY city WITH ROLLUP;
يعرض هذا الاستعلام إجمالي المبيعات لكل مدينة بالإضافة إلى الإجمالي العام.

7. الفرق بين GROUP BY و DISTINCT
يساعد DISTINCT و GROUP BY كلاهما في تنظيم البيانات، لكنهما يخدمان أغراضًا مختلفة. يزيل DISTINCT الصفوف المكررة، بينما يجمع GROUP BY البيانات ويجري التجميعات.
مقارنة استعلامات عينة
استخدام DISTINCT للحصول على قائمة فريدة من فئات المنتجات:
SELECT DISTINCT product_category
FROM sales;
استخدام GROUP BY للحصول على عدد المبيعات لكل فئة منتج:
SELECT product_category, COUNT(*)
FROM sales
GROUP BY product_category;
DISTINCT only removes duplicates, while GROUP BY performs aggregation.
يُزيل DISTINCT التكرارات فقط، بينما يقوم GROUP BY بالتجميع.
8. Optimizing GROUP BY Performance in MySQL
8. تحسين أداء GROUP BY في MySQL
When working with large datasets, optimizing GROUP BY performance is crucial. Proper configurations and query tuning can significantly improve efficiency.
عند التعامل مع مجموعات بيانات كبيرة، يُعد تحسين أداء GROUP BY أمرًا حيويًا. يمكن للتكوينات الصحيحة وضبط الاستعلامات أن يحسّن الكفاءة بشكل كبير.
1. Using Indexes
1. استخدام الفهارس
Adding indexes to columns used in GROUP BY improves search and grouping speed.
إضافة فهارس إلى الأعمدة المستخدمة في GROUP BY يحسّن سرعة البحث والتجميع.
CREATE INDEX idx_category ON sales(product_category);
Proper indexing can greatly enhance performance.
يمكن للفهرسة السليمة أن تعزز الأداء بشكل كبير.
2. Adjusting Memory Settings
2. تعديل إعدادات الذاكرة
Optimizing memory settings such as sort_buffer_size and tmp_table_size improves performance when handling large datasets.
تحسين إعدادات الذاكرة مثل sort_buffer_size و tmp_table_size يحسّن الأداء عند معالجة مجموعات بيانات كبيرة.
SET GLOBAL sort_buffer_size = 2M;
SET GLOBAL tmp_table_size = 64M;
Increasing memory reduces disk writes and shortens query execution time.
زيادة الذاكرة تقلل من عمليات الكتابة على القرص وتقصّر زمن تنفيذ الاستعلام.
3. Simplifying Queries
3. تبسيط الاستعلامات
Complex queries slow performance. Avoid excessive JOINs and subqueries. Remove unnecessary columns and conditions to improve speed.
الاستعلامات المعقدة تبطئ الأداء. تجنّب عمليات JOIN و subqueries الزائدة. احذف الأعمدة والشروط غير الضرورية لتحسين السرعة.
4. Version-Specific Features
4. ميزات خاصة بالإصدار
In MySQL 8.0 and later, hash-based grouping is available in addition to sort-based grouping. Hash-based grouping is faster for large datasets.
في MySQL 8.0 وما بعده، تتوفر التجميع القائم على التجزئة بالإضافة إلى التجميع القائم على الفرز. التجميع القائم على التجزئة أسرع للمجموعات الكبيرة من البيانات.
SET optimizer_switch = 'hash_join=on';
5. Using Query Cache
5. استخدام ذاكرة التخزين المؤقت للاستعلامات
In MySQL 5.7 and earlier, enabling query cache improves performance for repeated queries.
في MySQL 5.7 وما قبله، تمكين ذاكرة التخزين المؤقت للاستعلامات يحسّن الأداء للاستعلامات المتكررة.
SET GLOBAL query_cache_size = 16M;
SET GLOBAL query_cache_type = 1;
6. Considering Partitioning
6. النظر في التجزئة
MySQL’s partitioning feature splits large databases into smaller segments, speeding up query execution.
ميزة التجزئة في MySQL تقسم قواعد البيانات الكبيرة إلى أقسام أصغر، مما يسرّع تنفيذ الاستعلام.
ALTER TABLE sales PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p0 VALUES LESS THAN (2021),
PARTITION p1 VALUES LESS THAN (2022),
PARTITION p2 VALUES LESS THAN (2023)
);
9. Summary: Effective Use of GROUP BY
9. الملخص: الاستخدام الفعّال لـ GROUP BY
The GROUP BY clause is an essential SQL tool for grouping and aggregating data. In this article, you learned the basics of GROUP BY, how to use it with HAVING and ORDER BY, and advanced features like WITH ROLLUP. You also explored performance optimizations using indexes, memory settings, and version-specific features like hash-based grouping in MySQL 8.0.
عبارة GROUP BY هي أداة أساسية في SQL لتجميع البيانات وتلخيصها. في هذه المقالة، تعلمت أساسيات GROUP BY، وكيفية استخدامها مع HAVING و ORDER BY، والميزات المتقدمة مثل WITH ROLLUP. كما استكشفت تحسينات الأداء باستخدام الفهارس، وإعدادات الذاكرة، والميزات الخاصة بالإصدار مثل التجميع القائم على التجزئة في MySQL 8.0.
Additionally, we covered advanced MySQL features such as query caching and partitioning for handling large datasets more efficiently. By applying these techniques appropriately, you can improve data analysis and reporting performance in your projects.
بالإضافة إلى ذلك، تناولنا ميزات MySQL المتقدمة مثل التخزين المؤقت للاستعلامات والتجزئة للتعامل مع مجموعات البيانات بشكل أكثر كفاءة. من خلال تطبيق هذه التقنيات بشكل مناسب، يمكنك تحسين أداء تحليل البيانات وإعداد التقارير في مشاريعك.


