ما هو DISTINCT؟
DISTINCT كلمة مفتاحية تُستخدم مع SELECT لإزالة الصفوف المكررة من نتائج الاستعلام وإرجاع القيم الفريدة فقط.
تخيل أن لديك جدول طلبات يحتوي على عمود للبلد. إذا أردت معرفة "ما هي الدول التي طلب منها العملاء؟" بدون تكرار، تستخدم DISTINCT.
- استخراج قائمة الفئات المتاحة في المتجر
- معرفة الدول التي يتواجد فيها العملاء
- الحصول على قائمة الأقسام في الشركة
- إيجاد القيم الفريدة لأي عمود
الصيغة الأساسية
SELECT DISTINCT column_name
FROM table_name;
أمثلة عملية
المثال 1: استخراج القيم الفريدة من عمود واحد
لنفترض لدينا جدول orders التالي:
| id | customer | country | amount |
|---|---|---|---|
| 1 | أحمد | السعودية | 500 |
| 2 | سارة | الإمارات | 300 |
| 3 | محمد | السعودية | 750 |
| 4 | فاطمة | مصر | 200 |
| 5 | علي | الإمارات | 600 |
| 6 | نور | السعودية | 400 |
بدون DISTINCT:
SELECT country FROM orders;
النتيجة: السعودية، الإمارات، السعودية، مصر، الإمارات، السعودية (6 صفوف مع تكرار)
مع DISTINCT:
SELECT DISTINCT country FROM orders;
| country |
|---|
| السعودية |
| الإمارات |
| مصر |
المثال 2: DISTINCT مع عدة أعمدة
عند استخدام DISTINCT مع عدة أعمدة، تُعتبر الصفوف فريدة بناءً على مجموع قيم كل الأعمدة.
-- جدول employees
SELECT DISTINCT department, city
FROM employees;
هذا سيُرجع كل مجموعة فريدة من (القسم + المدينة). مثلاً: (المبيعات، الرياض) و (المبيعات، جدة) يُعتبران صفين مختلفين.
المثال 3: COUNT مع DISTINCT
لمعرفة عدد القيم الفريدة، ندمج DISTINCT مع COUNT:
-- كم عدد الدول المختلفة للعملاء؟
SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;
| unique_countries |
|---|
| 3 |
DISTINCT مقابل GROUP BY
قد يبدو أن DISTINCT و GROUP BY يفعلان نفس الشيء، لكن هناك فروقات:
DISTINCT: لإزالة التكرار فقطGROUP BY: لإزالة التكرار + تطبيق دوال التجميع (SUM, COUNT, etc.)
-- هذان الاستعلامان يعطيان نفس النتيجة
SELECT DISTINCT country FROM orders;
SELECT country FROM orders GROUP BY country;
-- لكن GROUP BY يمكنه فعل أكثر:
SELECT country, COUNT(*) AS order_count
FROM orders
GROUP BY country;
التعامل مع NULL
DISTINCT يعتبر جميع قيم NULL متساوية - أي سيظهر NULL مرة واحدة فقط في النتيجة.
-- إذا كان لدينا موظفون بدون قسم (NULL)
SELECT DISTINCT department
FROM employees;
-- النتيجة ستحتوي NULL مرة واحدة فقط
اعتبارات الأداء
DISTINCTيتطلب فرز البيانات أو استخدام hash، مما قد يؤثر على الأداء- تجنب استخدام
SELECT DISTINCT *على جداول كبيرة - استخدم DISTINCT فقط عندما تحتاجه حقاً
- إذا كانت البيانات أصلاً فريدة (مثل PRIMARY KEY)، لا حاجة لـ DISTINCT
تمرين عملي
اكتب استعلام SQL لاستخراج الفئات الفريدة من جدول products
SELECT DISTINCT column_name FROM table_name
اختبر معلوماتك
📝 أسئلة سريعة
1. ما هي وظيفة DISTINCT في SQL؟
2. كيف نحسب عدد القيم الفريدة؟
3. عند استخدام DISTINCT مع عدة أعمدة، كيف يُحدد التكرار؟
الخلاصة
DISTINCTيُزيل الصفوف المكررة من النتائج- يمكن استخدامه مع عمود واحد أو عدة أعمدة
COUNT(DISTINCT col)يحسب عدد القيم الفريدة- جميع قيم NULL تُعتبر متساوية
- استخدمه بحذر على الجداول الكبيرة لاعتبارات الأداء