MySQL الدوال التجميعية: المجموع، العد، AVG & الأعلى
⚡ ملخص ذكي
الوظائف المجمعة في MySQL إجراء عملية حسابية على عدة صفوف في عمود واحد وإرجاع قيمة ملخصة واحدة. الدوال الخمس القياسية ISO هي: COUNT و SUM و AVG، و MIN و MAX - تُستخدم في تشغيل كل تقرير تقريبًا تنتجه قاعدة البيانات.

ما هي الدوال التجميعية في MySQL?
An دالة مجمعة تقرأ هذه الدالة عدة صفوف من عمود واحد وتدمجها في قيمة واحدة. وتتمحور دوال التجميع حول:
- إجراء العمليات الحسابية على صفوف متعددة
- من عمود واحد من الجدول
- وإرجاع قيمة واحدة.
يحدد معيار ISO خمس (5) دوال تجميعية، وهي:
- بالإحصاء
- مجموع
- AVG
- دقيقة
- وفر
قاعدة واحدة تنطبق على الخمسة جميعاً: تتجاهل الدوال التجميعية القيم الفارغة (NULL).. COUNT(*) هو الاستثناء الوحيد، وسننظر في السبب أدناه.
لماذا استخدام الوظائف المجمعة
تختلف متطلبات المعلومات باختلاف مستويات المؤسسة. فعادةً ما يهتم كبار المديرين بالأرقام الإجمالية، وليس بالتفاصيل الفردية.
تتيح لنا الوظائف التجميعية إنتاج بيانات ملخصة بسهولة من قاعدة البيانات الخاصة بنا.
على سبيل المثال، قد تحتاج الإدارة إلى التقارير التالية من قاعدة بيانات myflix الخاصة بنا:
- الأفلام الأقل إيجارًا.
- معظم الأفلام المستأجرة.
- متوسط عدد مرات استئجار كل فيلم في الشهر.
جميع التقارير المذكورة أعلاه مستمدة من دوال التجميع. دعونا نلقي نظرة على كل منها بالتفصيل.
وظيفة العد
تقوم دالة COUNT بإرجاع العدد الإجمالي للقيم في الحقل المحدد، وذلك لكل من أنواع البيانات الرقمية وغير الرقمية. مثل كل دالة تجميعية، فإن دالة COUNT(column) تستبعد القيم الفارغة (NULL).
الدالة COUNT(*) هي صيغة خاصة تُرجع عدد جميع الصفوف في جدول. كما أنها تحسب القيم الفارغة والتكرارات، لأنه يحسب الصفوف بدلاً من القيم.
يحتوي جدول تأجير الأفلام على هذه البيانات:
| رقم المرجع | تاريخ الصفقة | تاريخ العودة | رقم العضوية | movie_id | فيلم_عاد |
|---|---|---|---|---|---|
| 11 | 20-06-2012 | اغية | 1 | 1 | 0 |
| 12 | 22-06-2012 | 25-06-2012 | 1 | 2 | 0 |
| 13 | 22-06-2012 | 25-06-2012 | 3 | 2 | 0 |
| 14 | 21-06-2012 | 24-06-2012 | 2 | 2 | 0 |
| 15 | 23-06-2012 | اغية | 3 | 3 | 0 |
لنفترض أننا نريد الحصول على عدد مرات تأجير الفيلم ذي المعرف 2.
SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;
تنفيذ هذا في MySQL طاولة العمل يُرجع الاستعلام ضد قاعدة بيانات myflixdb القيمة 3، لأن ثلاثة صفوف تحمل رقم الفيلم 2.
| COUNT(`movie_id`) |
|---|
| 3 |
كلمة رئيسية مميزة
يجيب العد على سؤال "كم عدد؟". السؤال التالي عادةً ما يكون "كم عدد؟" مختلف "الواحدات"، وهذا هو الغرض من DISTINCT.
تستبعد الكلمة المفتاحية DISTINCT النتائج المكررة من نتائجنا حسب المجموعةping القيم المتطابقة معًا، تمامًا كما يوضح الرسم التوضيحي أعلاه.
لنبدأ أولاً بتنفيذ استعلام بسيط.
SELECT `movie_id` FROM `movierentals`;
| movie_id |
|---|
| 1 |
| 2 |
| 2 |
| 2 |
| 3 |
والآن نفس الاستعلام مع الكلمة المفتاحية DISTINCT:
SELECT DISTINCT `movie_id` FROM `movierentals`;
يستبعد الأمر DISTINCT السجلات المكررة:
| movie_id |
|---|
| 1 |
| 2 |
| 3 |
COUNT مقابل COUNT(*) مقابل COUNT(DISTINCT): أيها يجب عليك استخدامه؟
يمكن أيضًا وضع DISTINCT في الداخل دالة تجميعية، وهنا يضيع معظم المبتدئين tracيتم حساب k من الصفوف فعليًا. تعمل النماذج الأربعة أدناه جميعها على نفس جدول تأجير الأفلام المكون من خمسة صفوف الموضح سابقًا، ومع ذلك، لا تُرجع جميعها نفس العدد. يكمن الاختلاف في سؤالين: هل يحسب النموذج الصفوف أم القيم، وهل يحتفظ بالبيانات المكررة؟
| شكل | ما يهم | نتائج البحث عن تأجير الأفلام |
|---|---|---|
| عدد(*) | كل صف، بما في ذلك الصفوف المكررة والصفوف التي تحتوي على قيمة فارغة تمامًا | 5 |
| COUNT(`movie_id`) | كل قيمة غير فارغة في العمود، بما في ذلك القيم المكررة | 5 |
| COUNT(`return_date`) | القيم غير الفارغة فقط — يتم تخطي تاريخي الإرجاع الفارغين | 3 |
| COUNT(DISTINCT `movie_id`) | القيم الفريدة غير الفارغة فقط | 3 |
SELECT COUNT(*) AS `all_rows`, COUNT(`return_date`) AS `returned_rows`, COUNT(DISTINCT `movie_id`) AS `unique_movies` FROM `movierentals`;
💡 نصيحة: استخدم COUNT(*) لحساب عدد الصفوف، وCOUNT(column) عندما تعني القيمة NULL "غير منطبق"، وCOUNT(DISTINCT column) للقيم الفريدة. عكس DISTINCT هو ALL - وهو الوضع الافتراضي، ولذلك نادرًا ما يُستخدم.
وظيفة مين
وظيفة مين تُرجع أصغر قيمة في حقل الجدول المحدد.
لنفترض أننا نريد معرفة السنة التي صدر فيها أقدم فيلم في مكتبتنا. MySQLتعطينا دالة MIN ذلك.
SELECT MIN(`year_released`) FROM `movies`;
النتيجة:
| MIN(`year_released`) |
|---|
| 2005 |
وظيفة ماكس
كما يوحي الاسم، فإن الدالة MAX هي عكس الدالة MIN. هو - هي إرجاع أكبر قيمة من حقل الجدول المحدد.
لنفترض أننا نريد معرفة السنة التي صدر فيها أحدث فيلم في قاعدة بياناتنا. المثال التالي يُعيدها.
SELECT MAX(`year_released`) FROM `movies`;
النتيجة:
| أقصى قيمة لـ (`year_released`) |
|---|
| 2012 |
مجموع وظيفة
تستخدم الدالتان MIN وMAX قيمة موجودة من عمود. أما الدالتان SUM و AVG احسب رقمًا جديدًا من العمود بأكمله.
لنفترض أننا نريد معرفة إجمالي المدفوعات التي تمت حتى الآن. MySQL مجموع وظيفة تُرجع مجموع جميع القيم في العمود المحدد. يعمل SUM على الحقول الرقمية فقطو يتم استبعاد القيم الفارغة من النتيجة.
يوضح الجدول التالي البيانات الموجودة في جدول المدفوعات.
| معرف الدفع | رقم العضوية | تاريخ الدفع | وصف | المبلغ المدفوع | الرقم المرجعي الخارجي |
|---|---|---|---|---|---|
| 1 | 1 | 23-07-2012 | دفع إيجار الفيلم | 2500 | 11 |
| 2 | 1 | 25-07-2012 | دفع إيجار الفيلم | 2000 | 12 |
| 3 | 3 | 30-07-2012 | دفع إيجار الفيلم | 6000 | اغية |
الاستعلام الموضح أدناه يحصل على جميع المدفوعات التي تمت ويجمعها في نتيجة واحدة: 2500 + 2000 + 6000 = 10500.
SELECT SUM(`amount_paid`) FROM `payments`;
النتيجة:
| مجموع (`المبلغ_المدفوع`) |
|---|
| 10500 |
AVG وظيفة
استخدم MySQL AVG وظيفة إرجاع متوسط القيم في عمود محدد. تمامًا مثل الدالة SUM، فهي يعمل فقط على أنواع البيانات الرقمية.
لنفترض أننا نريد إيجاد متوسط المبلغ المدفوع. يمكننا استخدام الاستعلام التالي، الذي يقسم المجموع 10500 على صفوف الدفع الثلاثة غير الفارغة.
SELECT AVG(`amount_paid`) FROM `payments`;
النتيجة:
| AVG(`المبلغ_المدفوع`) |
|---|
| 3500 |
⚠️ تحذير: AVG يقسم على عدد الصفوف غير الفارغة، وليس على عدد صفوف الجدول. يتم تجاهل القيمة الفارغة بدلاً من احتسابها كصفر، مما يؤدي إلى رفع المتوسط بشكل غير ملحوظ. استخدم AVG(IFNULL(`amount_paid`, 0)) عندما تعني القيمة المفقودة الصفر.
مثال عملي: دمج الدوال التجميعية مع عبارة GROUP BY
أعادت كل دالة من الدوال المذكورة أعلاه رقمًا واحدًا للجدول بأكمله. إضافة GROUP BY تُرجع العبارة رقمًا واحدًا لكل مجموعة بدلاً من ذلك - وهكذا تُبنى التقارير الحقيقية.
يقوم المثال التالي بتجميع الأعضاء حسب الاسم، ثم يحسب إجمالي عدد المدفوعات، ومتوسط مبلغ الدفعة، والمجموع الكلي لمبالغ الدفع لكل عضو.
SELECT m.`full_names`, COUNT(p.`payment_id`) AS `paymentscount`, AVG(p.`amount_paid`) AS `averagepaymentamount`, SUM(p.`amount_paid`) AS `totalpayments` FROM members m, payments p WHERE m.`membership_number` = p.`membership_number` GROUP BY m.`full_names`;
تنفيذ المثال أعلاه في MySQL يُعطينا برنامج Workbench النتائج التالية.
يربط الاستعلام الجدولين في عبارة WHERE - وهو أسلوب الربط بالفاصلة القديم. أما الكود الحديث فيكتب نفس المنطق بشكل صريح. الربط الداخلي … تشغيللاحظ أيضًا أنه يجب أن يظهر كل عمود غير مجمع في قائمة SELECT في GROUP BY، أو MySQL 5.7 والإصدارات اللاحقة ترفض الاستعلام ضمن ONLY_FULL_GROUP_BY. انظر رسمي MySQL مرجع دالة التجميع.


