في هذا الدرس 6تصفّح المواضيع
بينما تُعيد الاستعلامات العادية صفاً واحداً مقابل كل صف يطابق الشرط، تعمل الدوال التجميعية على قراءة مجموعة كاملة من الصفوف ودمجها لإنتاج قيمة تلخيصية واحدة.
- تلخيص الجدول الكلي: عند استدعاء الدوال التجميعية في جملة
SELECT، يعامل محرك MySQL جميع الصفوف التي اجتازت شرطWHEREكمجموعة واحدة ويُعيد صفاً ملخصاً واحداً فقط. - القاعدة الذهبية مع NULL: تتجاهل جميع الدوال التجميعية القيم الفارغة
NULLأثناء الحساب، باستثناء الدالةCOUNT(*)وحدها التي تعد الصفوف الكلية.
يمكنك استدعاء عدة دوال تجميعية جنباً إلى جنب في جملة SELECT واحدة لحساب مؤشرات الأداء في مسحة واحدة للجدول.
تلخيص البيانات بالدوال التجميعية الخمس وسلوكها مع NULL
-- 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() صورتين أساسيتين تختلف نتيجتهما عند احتواء العمود على قيم فارغة NULL:
- الصيغة
COUNT(*): تعد إجمالي الصفوف التي حققت شرطWHEREبغض النظر عن محتوى الأعمدة أو فراغها. - الصيغة
COUNT(column_name): تعد فقط الصفوف التي يحتوي فيها العمود المحدد على قيمة فعلية غير فارغة، وتتخطى أي صف يحمل القيمةNULLفي ذلك العمود.
إذا لم يطابق الاستعلام أي صف، تُعيد دالة COUNT() دائماً العدد الصحيح 0 ولا تُعيد NULL أبداً.
-- 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;
توجّه الكلمة المفتاحية DISTINCT داخل COUNT(DISTINCT expr) محرك MySQL إلى إزالة التكرار أولاً ثم عد القيم الفريدة غير الفارغة فقط.
- حساب الكيانات الفريدة: بينما تعد
COUNT(customer_id)إجمالي الطلبات، تعدCOUNT(DISTINCT customer_id)عدد العملاء الفريدين الذين أجروا تلك الطلبات. - عد التوليفات الفريدة لعدة أعمدة: يتميز MySQL بدعم تمرير أكثر من عمود داخل الدالة مثل
COUNT(DISTINCT country, city)لحساب عدد الثنائيات الفريدة غير الفارغة مباشرة.
وكما هو الحال في COUNT(col)، تتجاهل COUNT(DISTINCT col) القيم الفارغة NULL تماماً.
-- 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() و AVG() لحساب المجاميع الكلية والمتوسطات الحسابية على الأعمدة الرقمية والمالية.
- دالة المجموع
SUM(expr): تجمع كافة القيم غير الفارغة؛ وإذا لم يطابق الشرط أي صف أو كانت جميع القيم فارغة، تُعيد الدالةNULLوليس0. - قاعدة المقام في
AVG(expr): تقسم الدالة مجموع القيم غير الفارغة على عدد الصفوف غير الفارغة فقط؛ أي أن الصفوف التي تحملNULLلا تدخل في البسط ولا في المقام.
عند تطبيق SUM() و AVG() على أعمدة العملات الدقيقة DECIMAL، يستخدم MySQL الحساب العشري المضبوط لمنع أخطاء التقريب العشري.
-- 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() والقيمة الكبرى MAX() بعملهما على جميع أنواع البيانات القابلة للمقارنة من أرقام وتواريخ وسلاسل نصية.
- مع الأرقام: تستخرج
MIN(price)أقل سعر، وتستخرجMAX(price)أعلى سعر. - مع التواريخ والأوقات: تُعيد
MIN(created_at)أقدم تاريخ مسجل، وتُعيدMAX(created_at)أحدث تاريخ مسجل. - مع النصوص: ترتّب النصوص أبجدياً وفق نظام المقارنة
Collationللعمود وتُعيد أول وآخر قيمة نصية.
إذا كان العمود مفهرساً بفهرس B-Tree، يجلب MySQL قيمتي MIN و MAX لحظياً من أول وآخر ورقة في الفهرس دون قراءة الجدول.
-- 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 وعند خلو الجدول من النتائج:
| الدالة التجميعية | أنواع البيانات المدعومة | هل تتجاهل 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().
-- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 AVG AVG
- Arithmetic Average (Mean)
- المتوسط الحسابي للقيم الرقمية غير الفارغة في العمود
- للمراجعة
- 02 MIN MIN
- Minimum Value
- أصغر قيمة رقمية أو أقدم تاريخ أو أول نص أبجدياً في العمود
- للمراجعة
- 03 MAX MAX
- Maximum Value
- أكبر قيمة رقمية أو أحدث تاريخ أو آخر نص أبجدياً في العمود
- للمراجعة
- 04 KPI KPI
- Key Performance Indicator
- مؤشر الأداء الرئيسي المستخرج عبر دوال التجميع في لوحات التقارير
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
اكتب استعلام SELECT على جدول customers يعرض إجمالي الصفوف باسم total_customers وعدد العملاء الذين لديهم بريد غير فارغ باسم customers_with_email.
-
اكتب استعلام SELECT على جدول invoices يعرض SUM(amount) و AVG(amount) و MIN(amount) و MAX(amount) للفواتير التي تحقق الشرط is_paid = 1.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
أي دالة من الدوال التجميعية التالية لا تتجاهل القيم الفارغة NULL؟
تعد الدالة COUNT(*) جميع الصفوف المطابقة بغض النظر عن محتوى الأعمدة، بينما تتجاهل بقية الدوال قيم NULL.
جدول يضم 4 صفوف بقيم المكافآت: 100 و 200 و 300 و NULL. ما النتيجة التي تُعيدها الدالة AVG(bonus)؟
تستبعد دالة AVG الصف الفارغ من المجموع ومن العدد المقسوم عليه (600 / 3 = 200).
ماذا تُعيد كل من COUNT(*) و SUM(price) عندما لا يطابق شرط WHERE أي صف في الجدول؟
عند عدم تطابق أي صف تُعيد COUNT دائماً الصفر 0، بينما تُعيد SUM و AVG و MIN و MAX القيمة NULL.
أي تعبير يحسب عدد الأقسام الفريدة غير المكررة في جدول الموظفين employees؟
توضع الكلمة المفتاحية DISTINCT داخل قوسي الدالة COUNT(DISTINCT dept_id) لعد القيم الفريدة غير الفارغة.
أي دوال تجميعية تعمل مع أعمدة التواريخ DATE والنصوص VARCHAR بالإضافة إلى الأعمدة الرقمية؟
تعمل COUNT و MIN و MAX مع النصوص والتواريخ والأرقام، بينما تختص SUM و AVG بالعمليات الحسابية الرقمية.
ماذا تُعيد الدالة MAX(created_at) عند تشغيلها على جدول الطلبات orders؟
زمنياً تُعد التواريخ الأحدث أكبر قيمةً من الأقدم، لذا تُعيد MAX(created_at) أحدث وقت مسجل.
هل يوجد أي فرق في الأداء أو خطة التنفيذ بين COUNT(*) و COUNT(1) في محرك InnoDB بـ MySQL 8؟
يؤكد توثيق MySQL الرسمي أن COUNT(*) و COUNT(1) متطابقتان تماماً في الأداء وخطة التنفيذ.
كم صفاً يُعيد الاستعلام SELECT COUNT(*), SUM(total), MIN(total) FROM orders؟
يلخّص الاستعلام التجميعي الكلي كامل الجدول في صف واحد يضم نتائج الدوال المطلوبة كأعمدة.