شرح SQL DISTINCT وCOUNT: كيفية الاستعلام والاختيار وعدّ القيم الفريدة
مقدمة إلى SQL DISTINCT وCOUNT
عند العمل مع قواعد البيانات، نحتاج كثيراً إلى معرفة عدد السجلات داخل جدول معيّن، أو حساب عدد القيم الفريدة داخل عمود محدد. هنا تبرز أهمية الدالتين COUNT والكلمة المفتاحية DISTINCT في SQL، إذ تساعدان على استخراج معلومات دقيقة ومفيدة من البيانات دون تعقيد.
في هذا الدليل العملي، ستتعرف إلى كيفية استخدام COUNT لعدّ الصفوف، وكيفية دمجها مع DISTINCT لحساب القيم غير المكررة، بالإضافة إلى توظيف WHERE وGROUP BY وORDER BY وHAVING للحصول على نتائج أكثر احترافية.

ما هي الدالة COUNT في SQL؟
تُستخدم الدالة COUNT لإرجاع عدد الصفوف أو عدد القيم الموجودة ضمن مجموعة بيانات معيّنة. وهي من أكثر الدوال استخداماً في تحليل البيانات وكتابة الاستعلامات الإحصائية.
الصيغة الأساسية للدالة COUNT
SELECT COUNT(column_name) FROM table_name;
في هذا الاستعلام:
SELECTتطلب من قاعدة البيانات جلب بيانات محددة.COUNT(column_name)تحسب عدد القيم الموجودة داخل العمود المحدد.FROMتحدد اسم الجدول الذي سيتم تنفيذ الاستعلام عليه.
من المهم الانتباه إلى أن COUNT(column_name) لا تحتسب القيم NULL، لأن NULL تعني أن القيمة غير موجودة فعلياً في السجل.
استخدام COUNT(*)
في كثير من الحالات، قد تحتاج إلى عدّ جميع الصفوف في الجدول بغض النظر عن محتوى الأعمدة. هنا يمكن استخدام النجمة *:
SELECT COUNT(*) FROM table_name;
يعيد هذا الاستعلام العدد الإجمالي للصفوف داخل الجدول.
استخدام ALL مع COUNT
يمكن أيضاً كتابة الاستعلام باستخدام ALL:
SELECT COUNT(ALL column_name) FROM table_name;
الكلمة المفتاحية ALL تعني احتساب جميع القيم، بما فيها القيم المكررة. عملياً، لا تحتاج غالباً إلى كتابتها صراحة، لأن COUNT تعتمد هذا السلوك افتراضياً.
ما وظيفة DISTINCT في SQL؟
تُستخدم DISTINCT لإرجاع القيم الفريدة فقط، أي تجاهل القيم المكررة داخل العمود. وعند دمجها مع COUNT، يمكننا معرفة عدد القيم المختلفة غير المكررة.
SELECT COUNT(DISTINCT column_name) FROM table_name;
هذا النوع من الاستعلامات مفيد جداً عندما تريد معرفة عدد المستخدمين الفريدين، أو المدن المختلفة، أو أي قيمة لا ترغب في احتساب تكرارها أكثر من مرة.
الفرق بين COUNT(column_name) وCOUNT(*) وCOUNT(DISTINCT column_name)
| الصيغة | الوظيفة |
|---|---|
COUNT(column_name) |
تحسب عدد القيم غير الفارغة NOT NULL داخل عمود معين. |
COUNT(*) |
تحسب جميع الصفوف في الجدول. |
COUNT(DISTINCT column_name) |
تحسب عدد القيم الفريدة غير المكررة وغير الفارغة. |
تطبيق عملي على جدول campers
لنفترض أن لدينا جدولاً باسم campers يحتوي على الأعمدة التالية:
idnameagecounselor

عدّ جميع الصفوف داخل الجدول
إذا أردنا معرفة العدد الإجمالي للسجلات داخل جدول campers، نستخدم الاستعلام التالي:
SELECT COUNT(*) FROM campers;

النتيجة هي 12، وهذا يعني أن الجدول يحتوي على 12 صفاً.
استخدام WHERE مع COUNT في SQL
عندما لا نرغب في عدّ كل الصفوف، بل مجموعة محددة فقط، نستخدم WHERE لتصفية النتائج قبل تطبيق COUNT.
عدّ السجلات الخاصة بالمشرف Ashley
إذا أردنا معرفة عدد الصفوف التي يكون فيها اسم المشرف Ashley، نكتب الشرط بهذه الصورة:
WHERE counselor = "Ashley";
والاستعلام الكامل يكون كالتالي:
SELECT COUNT(*) FROM campers WHERE counselor = "Ashley";

تُظهر النتيجة أن الاسم Ashley يتكرر 4 مرات داخل الجدول.

عدّ السجلات الخاصة بالعمر 11
يمكننا تطبيق الفكرة نفسها على الأعمار:
WHERE age = 11;
والاستعلام الكامل:
SELECT COUNT(*) FROM campers WHERE age = 11;

توضح النتيجة وجود 3 مخيمين فقط بعمر 11 سنة.
استخدام GROUP BY مع COUNT
إذا كنت تريد تجميع البيانات بحسب قيمة محددة، مثل العمر، ثم حساب عدد السجلات داخل كل مجموعة، فإن GROUP BY هي الأداة المناسبة.
نبدأ أولاً بتحديد العمود المطلوب عرضه مع COUNT:
SELECT age, COUNT(*)
ثم نحدد الجدول ونجمع النتائج حسب العمر:
FROM campers GROUP BY age;
والاستعلام الكامل يصبح:
SELECT age, COUNT(*) FROM campers GROUP BY age;

بهذا الأسلوب، ستحصل على عدد المخيمين لكل عمر على حدة، مثل 11 و12 و13.
ترتيب النتائج باستخدام ORDER BY
بعد تجميع البيانات، قد تحتاج إلى ترتيب النتائج تصاعدياً أو تنازلياً. ويمكن تنفيذ ذلك باستخدام ORDER BY.
الترتيب من الأصغر إلى الأكبر
ORDER BY COUNT(*);
ويُضاف إلى نهاية الاستعلام:
SELECT age, COUNT(*) FROM campers GROUP BY age ORDER BY COUNT(*);

الترتيب من الأكبر إلى الأصغر باستخدام DESC
إذا أردت إظهار المجموعات ذات العدد الأكبر أولاً، فاستخدم DESC:
ORDER BY COUNT(*) DESC;
والاستعلام الكامل يكون:
SELECT age, COUNT(*) FROM campers GROUP BY age ORDER BY COUNT(*) DESC;

استخدام HAVING مع COUNT
تُستخدم HAVING لإضافة شرط على النتائج بعد تنفيذ التجميع بواسطة GROUP BY. وهي تختلف عن WHERE التي تعمل قبل التجميع.
مثلاً، إذا أردنا عرض الأعمار التي يكون عدد تكرارها أقل من 5 فقط، نستخدم الشرط التالي:
HAVING COUNT(*) < 5;
والاستعلام الكامل:
SELECT age, COUNT(*) FROM campers GROUP BY age HAVING COUNT(*) < 5;

في هذه الحالة، تم استبعاد الأعمار التي كان عددها أكبر من 5، وبذلك تحصل على نتائج أكثر دقة وفق الشرط المطلوب.
متى تستخدم DISTINCT مع COUNT؟
يُفضّل استخدام COUNT(DISTINCT column_name) عندما يكون هدفك معرفة عدد القيم المختلفة داخل عمود محدد، وليس إجمالي التكرارات. على سبيل المثال:
- عدد العملاء الفريدين في جدول الطلبات.
- عدد الدول المختلفة في قاعدة بيانات المستخدمين.
- عدد المشرفين المختلفين في جدول
campers.
مثال عملي:
SELECT COUNT(DISTINCT counselor) FROM campers;
سيعيد هذا الاستعلام عدد أسماء المشرفين المختلفة فقط، متجاهلاً أي تكرار.
أفضل الممارسات عند استخدام COUNT وDISTINCT في SQL
- استخدم
COUNT(*)عندما تريد عدد الصفوف الكامل. - استخدم
COUNT(column_name)إذا كنت تريد تجاهل القيمNULL. - استخدم
DISTINCTفقط عندما تكون القيم الفريدة مهمة فعلاً في التحليل. - ادمج
WHEREمعCOUNTلتقليل النتائج غير الضرورية. - استخدم
GROUP BYوHAVINGللحصول على تقارير أكثر دقة وتنظيماً.
خاتمة
تُعد الدالة COUNT من الأدوات الأساسية في SQL، لأنها تمنحك طريقة مباشرة وفعالة لعدّ الصفوف وتحليل البيانات. وعند دمجها مع DISTINCT، يمكنك الانتقال من مجرد العدّ إلى فهم أعمق لبنية البيانات والقيم الفريدة داخلها.
الصيغة الأساسية التي ينبغي تذكرها هي:
SELECT COUNT(column_name) FROM table_name;
كما يمكنك استخدام:
SELECT COUNT(*) FROM table_name;
الفرق الجوهري هو أن COUNT(column_name) يتجاهل القيم NULL، بينما COUNT(*) يركز على عدد الصفوف في النتيجة النهائية.
الخلاصة التقنية
إذا كنت تبني تقارير أو لوحات بيانات أو استعلامات تحليلية في SQL، فإن فهم العلاقة بين COUNT وDISTINCT وGROUP BY يمنحك قدرة أكبر على استخراج معلومات دقيقة وقابلة للاستخدام. من الناحية العملية، اختيار الصيغة الصحيحة لا يحسن دقة النتائج فقط، بل يسهم أيضاً في كتابة استعلامات أوضح وأسهل في الصيانة ضمن المشاريع البرمجية وقواعد البيانات الكبيرة.