MySQL الدوال التجميعية: المجموع، العد، AVG & الأعلى

⚡ ملخص ذكي

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

  • 🔢 سلوك العد: تتجاهل الدالة COUNT(column) القيم الفارغة، بينما تقوم الدالة COUNT(*) بحساب كل صف في الجدول، بما في ذلك التكرارات والقيم الفارغة.
  • 🚫 كلمة مفتاحية مميزة: يقوم الخيار DISTINCT بإزالة القيم المكررة قبل تشغيل الحساب؛ أما الخيار ALL فهو الوضع الافتراضي ويحتفظ بها.
  • 📉 الحد الأدنى والحد الأقصى: تُرجع الدالة MIN أصغر قيمة في عمود، بينما تُرجع الدالة MAX أكبر قيمة، وذلك بالنسبة للأنواع الرقمية والنصية والتاريخية على حد سواء.
  • ➕ مجموع و AVG: كلاهما يعمل على الأعمدة الرقمية فقط، وكلاهما يستبعد الصفوف الفارغة من النتيجة المُعادة.
  • 📊 تجميع حسب الاقتران: تؤدي إضافة GROUP BY إلى تحويل رقم ملخص واحد إلى صف ملخص واحد لكل مجموعة.
  • ⚠️ مصيدة فارغة: AVG يقسم على عدد الصفوف غير الفارغة فقط، لذا فإن القيم المفقودة ترفع المتوسط ​​بصمت.

ما هي الدوال التجميعية في MySQL?

An دالة مجمعة تقرأ هذه الدالة عدة صفوف من عمود واحد وتدمجها في قيمة واحدة. وتتمحور دوال التجميع حول:

  • إجراء العمليات الحسابية على صفوف متعددة
  • من عمود واحد من الجدول
  • وإرجاع قيمة واحدة.

يحدد معيار ISO خمس (5) دوال تجميعية، وهي:

  1. بالإحصاء
  2. مجموع
  3. AVG
  4. دقيقة
  5. وفر

قاعدة واحدة تنطبق على الخمسة جميعاً: تتجاهل الدوال التجميعية القيم الفارغة (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 النتائج التالية.

AVG الدالة المستخدمة مع GROUP BY

يربط الاستعلام الجدولين في عبارة WHERE - وهو أسلوب الربط بالفاصلة القديم. أما الكود الحديث فيكتب نفس المنطق بشكل صريح. الربط الداخلي … تشغيللاحظ أيضًا أنه يجب أن يظهر كل عمود غير مجمع في قائمة SELECT في GROUP BY، أو MySQL 5.7 والإصدارات اللاحقة ترفض الاستعلام ضمن ONLY_FULL_GROUP_BY. انظر رسمي MySQL مرجع دالة التجميع.

الأسئلة الشائعة

استخدم حيث الشرطية تقوم الدالة HAVING بتصفية الصفوف الفردية قبل حساب المجموع. أما الدالة HAVING فتقوم بتصفية النتائج المجمعة لاحقاً، لذا فإن HAVING فقط هي التي يمكنها الإشارة إلى مجموع مثل COUNT(*) أو SUM(amount_paid).

نعم. بدون استخدام GROUP BY، تتعامل الدالة التجميعية مع مجموعة النتائج بأكملها كمجموعة واحدة، وتعيد صفًا واحدًا فقط. أما إضافة GROUP BY فتقسم النتيجة إلى صف واحد لكل قيمة مجموعة مميزة.

نعم. على عكس SUM و AVGتعمل الدالتان MIN وMAX على أي نوع بيانات مماثل. في عمود نصي، تُرجعان القيمتين الأولى والأخيرة أبجديًا، وفي عمود تاريخ، تُرجعان أقدم وأحدث التواريخ.

نعم. يقوم مساعدو تحويل النصوص إلى SQL بترجمة أسئلة مثل "متوسط ​​الدفع لكل عضو" إلى استعلام GROUP BY. قم بتشغيل SQL المُنشأ في MySQL طاولة العمل وتحقق من عدد الصفوف قبل الوثوق بالأرقام.

السبب الشائع هو التعامل مع القيم الفارغة (NULL) وتكرار صفوف الربط. قد يستخدم نموذج الذكاء الاصطناعي دالة COUNT(*) بدلاً من COUNT(column)، أو يربط جدولاً مرتين، مما يؤدي إلى تضخيم كل قيمة SUM. لذا، تحقق دائمًا من القيمة باستخدام قيمة معروفة.

تلخيص هذه التدوينة بـ: