دوال COUNT وAVG وSUM من أكثر الدوال التجميعية استخداماً في SQL. تعمل هذه الدوال على مجموعة من الصفوف لتُرجع قيمة واحدة تلخّصها: COUNT لعدّ الصفوف، وAVG لحساب المتوسط، وSUM لحساب المجموع. وغالباً ما تُستخدم مع جملة GROUP BY لإجراء الحسابات على مجموعات منفصلة، أو وحدها لتلخيص الجدول كله.
الدالة COUNT
تَعُدّ COUNT عدد الصفوف. الصيغة COUNT(*) تَعُدّ كل الصفوف، بينما COUNT(column) تَعُدّ الصفوف التي لا تحمل قيمة NULL في العمود المحدد، وCOUNT(DISTINCT column) تَعُدّ القيم المختلفة فقط.
SELECT COUNT(*) FROM users;
SELECT COUNT(phone) FROM users; -- يتجاهل القيم الفارغة
SELECT COUNT(DISTINCT country) FROM users; -- عدد الدول المختلفة
الدالة AVG
تحسب AVG المتوسط الحسابي لقيم عمود رقمي، وتتجاهل القيم الفارغة تلقائياً أثناء الحساب.
SELECT AVG(price) AS avg_price FROM products;
الدالة SUM
تحسب SUM مجموع قيم عمود رقمي، وهي مثالية لحساب إجمالي المبيعات أو الكميات.
SELECT SUM(total) AS total_sales FROM orders;
الدمج مع GROUP BY
تظهر قوة هذه الدوال حقاً عند دمجها مع GROUP BY لحساب ملخص لكل مجموعة على حدة، كحساب إجمالي مبيعات كل تصنيف:
SELECT category, SUM(total) AS sales, COUNT(*) AS orders_count
FROM orders
GROUP BY category;
أخطاء شائعة
- توقّع أن COUNT(column) يَعُدّ كل الصفوف، بينما هو يتجاهل صفوف NULL في ذلك العمود.
- استخدام SUM أو AVG على عمود نصي بدلاً من عمود رقمي.
- نسيان أن الدوال التجميعية تتجاهل قيم NULL، ما قد يغيّر نتيجة المتوسط دون انتباه.
تمرين محلول
المطلوب: من جدول orders، احسب عدد الطلبات وإجمالي قيمتها ومتوسطها لكل عميل.
SELECT customer_id,
COUNT(*) AS orders_count,
SUM(total) AS total_value,
AVG(total) AS avg_value
FROM orders
GROUP BY customer_id;
جمعنا الطلبات حسب العميل، ثم طبّقنا الدوال الثلاث معاً لنحصل على ملخص متكامل لكل عميل في استعلام واحد.
الخلاصة
دوال COUNT وAVG وSUM تختصر الصفوف الكثيرة في قيم تلخيصية مفيدة. وفهم كيفية تعاملها مع قيم NULL، ودمجها مع GROUP BY، يفتح الباب أمام بناء تقارير وإحصاءات دقيقة مباشرةً من قاعدة البيانات.
