انتقل إلى محتوى الدرس
الدرس 30
دورة MySQL

الدوال التجميعية COUNT و SUM و AVG و MIN و MAX في MySQLMySQL Aggregate Functions COUNT SUM AVG MIN and MAX

تعلّم الدوال التجميعية COUNT و SUM و AVG و MIN و MAX في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
8
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع
ادمج مجموعة من صفوف الجدول في صف ملخص واحد باستخدام الدوال التجميعية في SQL.

بينما تُعيد الاستعلامات العادية صفاً واحداً مقابل كل صف يطابق الشرط، تعمل الدوال التجميعية على قراءة مجموعة كاملة من الصفوف ودمجها لإنتاج قيمة تلخيصية واحدة.

  • تلخيص الجدول الكلي: عند استدعاء الدوال التجميعية في جملة SELECT، يعامل محرك MySQL جميع الصفوف التي اجتازت شرط WHERE كمجموعة واحدة ويُعيد صفاً ملخصاً واحداً فقط.
  • القاعدة الذهبية مع NULL: تتجاهل جميع الدوال التجميعية القيم الفارغة NULL أثناء الحساب، باستثناء الدالة COUNT(*) وحدها التي تعد الصفوف الكلية.

يمكنك استدعاء عدة دوال تجميعية جنباً إلى جنب في جملة SELECT واحدة لحساب مؤشرات الأداء في مسحة واحدة للجدول.

تلخيص البيانات بالدوال التجميعية الخمس وسلوكها مع NULL

تتجاهل جميع الدوال التجميعية القيم الفارغة NULL باستثناء الدالة COUNT(*) التي تعد كامل الصفوف
مخطط توضيحي لدرس الدوال التجميعية COUNT و SUM و AVG و MIN و MAX في MySQL
مخطط توضيحي لدرس الدوال التجميعية COUNT و SUM و AVG و MIN و MAX في MySQL
SQL
-- Summarize all paid orders in a single KPI row
SELECT COUNT(*)        AS paid_orders,
       SUM(total_usd)  AS gross_revenue,
       AVG(total_usd)  AS avg_order_value
FROM orders
WHERE order_status = 'paid';
فرّق بدقة بين عد إجمالي الصفوف عبر COUNT(*) وعد القيم غير الفارغة في عمود محدد عبر COUNT(column).

تتخذ دالة العد COUNT() صورتين أساسيتين تختلف نتيجتهما عند احتواء العمود على قيم فارغة NULL:

  • الصيغة COUNT(*): تعد إجمالي الصفوف التي حققت شرط WHERE بغض النظر عن محتوى الأعمدة أو فراغها.
  • الصيغة COUNT(column_name): تعد فقط الصفوف التي يحتوي فيها العمود المحدد على قيمة فعلية غير فارغة، وتتخطى أي صف يحمل القيمة NULL في ذلك العمود.

إذا لم يطابق الاستعلام أي صف، تُعيد دالة COUNT() دائماً العدد الصحيح 0 ولا تُعيد NULL أبداً.

SQL
-- Total orders vs orders that have been shipped
SELECT COUNT(*)          AS total_orders,
       COUNT(shipped_at) AS shipped_orders,
       COUNT(*) - COUNT(shipped_at) AS unshipped_orders
FROM orders;
احسب عدد القيم الفريدة غير المكررة وغير الفارغة في عمود أو أكثر باستخدام COUNT(DISTINCT expr).

توجّه الكلمة المفتاحية DISTINCT داخل COUNT(DISTINCT expr) محرك MySQL إلى إزالة التكرار أولاً ثم عد القيم الفريدة غير الفارغة فقط.

  • حساب الكيانات الفريدة: بينما تعد COUNT(customer_id) إجمالي الطلبات، تعد COUNT(DISTINCT customer_id) عدد العملاء الفريدين الذين أجروا تلك الطلبات.
  • عد التوليفات الفريدة لعدة أعمدة: يتميز MySQL بدعم تمرير أكثر من عمود داخل الدالة مثل COUNT(DISTINCT country, city) لحساب عدد الثنائيات الفريدة غير الفارغة مباشرة.

وكما هو الحال في COUNT(col)، تتجاهل COUNT(DISTINCT col) القيم الفارغة NULL تماماً.

SQL
-- Count total orders vs unique buyers and unique cities
SELECT COUNT(*)                        AS total_orders,
       COUNT(DISTINCT customer_id)     AS unique_buyers,
       COUNT(DISTINCT country, city)   AS unique_locations
FROM orders
WHERE order_status = 'paid';
احسب المجاميع المالية والمتوسطات الحسابية بدالتي SUM(col) و AVG(col) وافهم أثر NULL على مقام المتوسط.

تُستخدم الدالتان الرقميتان SUM() و AVG() لحساب المجاميع الكلية والمتوسطات الحسابية على الأعمدة الرقمية والمالية.

  • دالة المجموع SUM(expr): تجمع كافة القيم غير الفارغة؛ وإذا لم يطابق الشرط أي صف أو كانت جميع القيم فارغة، تُعيد الدالة NULL وليس 0.
  • قاعدة المقام في AVG(expr): تقسم الدالة مجموع القيم غير الفارغة على عدد الصفوف غير الفارغة فقط؛ أي أن الصفوف التي تحمل NULL لا تدخل في البسط ولا في المقام.

عند تطبيق SUM() و AVG() على أعمدة العملات الدقيقة DECIMAL، يستخدم MySQL الحساب العشري المضبوط لمنع أخطاء التقريب العشري.

SQL
-- Financial totals and average rating across active products
SELECT SUM(stock_qty)              AS total_units,
       SUM(unit_price * stock_qty) AS inventory_value,
       AVG(unit_price)             AS mean_price,
       AVG(review_score)           AS mean_rating
FROM products
WHERE is_active = 1;
استخرج القيم الدنيا والقصوى للأرقام والتواريخ والنصوص باستخدام دالتي MIN(col) و MAX(col).

تتميز دالتا القيمة الصغرى MIN() والقيمة الكبرى MAX() بعملهما على جميع أنواع البيانات القابلة للمقارنة من أرقام وتواريخ وسلاسل نصية.

  • مع الأرقام: تستخرج MIN(price) أقل سعر، وتستخرج MAX(price) أعلى سعر.
  • مع التواريخ والأوقات: تُعيد MIN(created_at) أقدم تاريخ مسجل، وتُعيد MAX(created_at) أحدث تاريخ مسجل.
  • مع النصوص: ترتّب النصوص أبجدياً وفق نظام المقارنة Collation للعمود وتُعيد أول وآخر قيمة نصية.

إذا كان العمود مفهرساً بفهرس B-Tree، يجلب MySQL قيمتي MIN و MAX لحظياً من أول وآخر ورقة في الفهرس دون قراءة الجدول.

SQL
-- Price range and chronological order window
SELECT MIN(total_usd)  AS smallest_order,
       MAX(total_usd)  AS largest_order,
       MIN(created_at) AS first_order_at,
       MAX(created_at) AS latest_order_at
FROM orders
WHERE order_status = 'paid';
جدول مرجعي شامل يقارن الدوال التجميعية في MySQL 8 من حيث أنواع البيانات وسلوك NULL والجدول الفارغ.

يلخّص الجدول التالي خصائص الدوال التجميعية الأساسية في MySQL 8 وأنواع البيانات المدعومة وسلوكها مع NULL وعند خلو الجدول من النتائج:

الدالة التجميعيةأنواع البيانات المدعومةهل تتجاهل NULL؟النتيجة عند عدم تطابق أي صف
COUNT(*)جميع الصفوفلا (تعد جميع الصفوف)0
COUNT(col)جميع الأنواعنعم (تعد غير الفارغ)0
COUNT(DISTINCT col)جميع الأنواعنعم (الفريد غير الفارغ)0
SUM(col)الأعمدة الرقميةنعمNULL
AVG(col)الأعمدة الرقميةنعم (في البسط والمقام)NULL
MIN(col)الأرقام والتواريخ والنصوصنعمNULL
MAX(col)الأرقام والتواريخ والنصوصنعمNULL

ملخص الدرس: تعلّمت في هذا الدرس آلية تلخيص الصفوف عبر الدوال التجميعية، والفرق الجوهري بين COUNT(*) و COUNT(col) و COUNT(DISTINCT)، وحساب المجاميع والمتوسطات عبر SUM و AVG، واستخراج الحدود الصغرى والكبرى عبر MIN و MAX.
الخطوة التالية والدرس القادم: سنتعلّم في الدرس القادم كيفية تقسيم الجدول إلى مجموعات فرعية باستخدام جملة GROUP BY ودمج النصوص داخل كل مجموعة عبر GROUP_CONCAT().

SQL
-- Complete executive dashboard summary in one query
SELECT COUNT(*)                   AS total_orders,
       COUNT(DISTINCT customer_id) AS active_customers,
       SUM(total_usd)             AS total_revenue,
       AVG(total_usd)             AS avg_ticket,
       MIN(total_usd)             AS min_ticket,
       MAX(total_usd)             AS max_ticket
FROM orders
WHERE order_status = 'paid';
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنّا في هذا الدرس الدوال التجميعية COUNT و SUM و AVG و MIN و MAX في MySQL في MySQL 8 مع أمثلة عملية.

الخطوة التالية والدرس القادم

أكمل التدريبات والاختبار التفاعلي أدناه قبل الانتقال إلى الدرس التالي في مسار MySQL.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Aggregate Function الدالة التجميعية (Aggregate Function)
دالة في SQL تحسب قيمة ملخصة واحدة من مجموعة صفوف مثل COUNT و SUM و AVG و MIN و MAX.
للمراجعة
02 COUNT(*) vs COUNT(col) الفرق بين COUNT(*) و COUNT(col)
تعد COUNT(*) جميع الصفوف المطابقة، بينما تعد COUNT(col) فقط الصفوف التي لا تكون فيها قيمة العمود NULL.
للمراجعة
03 AVG() Denominator Rule قاعدة المقام في دالة AVG()
تقسم دالة AVG(col) مجموع القيم على عدد الصفوف غير الفارغة فقط وتتجاهل الصفوف الفارغة NULL.
للمراجعة
04 COUNT(DISTINCT expr) عد القيم الفريدة COUNT(DISTINCT)
صيغة تجميعية تعد القيم الفريدة غير المكررة وغير الفارغة داخل العمود.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 AVG AVG
Arithmetic Average (Mean)
المتوسط الحسابي للقيم الرقمية غير الفارغة في العمود
للمراجعة
02 MIN MIN
Minimum Value
أصغر قيمة رقمية أو أقدم تاريخ أو أول نص أبجدياً في العمود
للمراجعة
03 MAX MAX
Maximum Value
أكبر قيمة رقمية أو أحدث تاريخ أو آخر نص أبجدياً في العمود
للمراجعة
04 KPI KPI
Key Performance Indicator
مؤشر الأداء الرئيسي المستخرج عبر دوال التجميع في لوحات التقارير
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. اكتب استعلام SELECT على جدول customers يعرض إجمالي الصفوف باسم total_customers وعدد العملاء الذين لديهم بريد غير فارغ باسم customers_with_email.

  2. اكتب استعلام SELECT على جدول invoices يعرض SUM(amount) و AVG(amount) و MIN(amount) و MAX(amount) للفواتير التي تحقق الشرط is_paid = 1.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

أي دالة من الدوال التجميعية التالية لا تتجاهل القيم الفارغة NULL؟

تعد الدالة COUNT(*) جميع الصفوف المطابقة بغض النظر عن محتوى الأعمدة، بينما تتجاهل بقية الدوال قيم NULL.

02

جدول يضم 4 صفوف بقيم المكافآت: 100 و 200 و 300 و NULL. ما النتيجة التي تُعيدها الدالة AVG(bonus)؟

تستبعد دالة AVG الصف الفارغ من المجموع ومن العدد المقسوم عليه (600 / 3 = 200).

03

ماذا تُعيد كل من COUNT(*) و SUM(price) عندما لا يطابق شرط WHERE أي صف في الجدول؟

عند عدم تطابق أي صف تُعيد COUNT دائماً الصفر 0، بينما تُعيد SUM و AVG و MIN و MAX القيمة NULL.

04

أي تعبير يحسب عدد الأقسام الفريدة غير المكررة في جدول الموظفين employees؟

توضع الكلمة المفتاحية DISTINCT داخل قوسي الدالة COUNT(DISTINCT dept_id) لعد القيم الفريدة غير الفارغة.

05

أي دوال تجميعية تعمل مع أعمدة التواريخ DATE والنصوص VARCHAR بالإضافة إلى الأعمدة الرقمية؟

تعمل COUNT و MIN و MAX مع النصوص والتواريخ والأرقام، بينما تختص SUM و AVG بالعمليات الحسابية الرقمية.

06

ماذا تُعيد الدالة MAX(created_at) عند تشغيلها على جدول الطلبات orders؟

زمنياً تُعد التواريخ الأحدث أكبر قيمةً من الأقدم، لذا تُعيد MAX(created_at) أحدث وقت مسجل.

07

هل يوجد أي فرق في الأداء أو خطة التنفيذ بين COUNT(*) و COUNT(1) في محرك InnoDB بـ MySQL 8؟

يؤكد توثيق MySQL الرسمي أن COUNT(*) و COUNT(1) متطابقتان تماماً في الأداء وخطة التنفيذ.

08

كم صفاً يُعيد الاستعلام SELECT COUNT(*), SUM(total), MIN(total) FROM orders؟

يلخّص الاستعلام التجميعي الكلي كامل الجدول في صف واحد يضم نتائج الدوال المطلوبة كأعمدة.