DISTINCT على أعمدة متعددة
تحقّق من التفرد عبر مجموعات القيم
DISTINCT على أعمدة متعددة درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
لماذا نستخدم عدة أعمدة؟
أنت تعرف بالفعل أن SELECT DISTINCT يزيل الصفوف المكررة. لكن ماذا يعني «مكرر» عندما يُرجع استعلامك عدة أعمدة؟
لا يُعد الصف مكررًا إلا عندما تكون كل الأعمدة المحددة فيه تحمل القيمة نفسها الموجودة في صف آخر. فإذا اختلف عمود واحد فقط، يُحتفظ بالصفين.
جدول نموذجي: orders
لننشئ جدول orders صغيرًا لنجري عليه التجارب. فهو يخزّن العميل الذي اشترى من كل فئة والبلد الذي تم فيه الشراء.
CREATE TABLE orders (
id INTEGER,
customer VARCHAR(50),
category VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO orders VALUES
(1, 'Alice', 'Electronics', 'US'),
(2, 'Alice', 'Books', 'US'),
(3, 'Bob', 'Electronics', 'UK'),
(4, 'Alice', 'Electronics', 'US'),
(5, 'Bob', 'Electronics', 'UK'),
(6, 'Carol', 'Clothing', 'CA');استخدام DISTINCT على عمود واحد
تذكير سريع: يؤدي استخدام DISTINCT على عمود واحد إلى إرجاع كل قيمة فريدة لذلك العمود فقط.
نحصل هنا على كل اسم عميل فريد، أي ثلاثة صفوف فقط رغم وجود ستة طلبات.
SELECT DISTINCT customer
FROM orders;استخدام DISTINCT على عمودين
أضف الآن عمودًا ثانيًا. تظل الكلمة المفتاحية DISTINCT ظاهرة مرة واحدة فقط، مباشرةً بعد SELECT. وتتعامل قاعدة البيانات مع كل زوج فريد من (customer, category) على أنه صف واحد.
تظهر Alice مرتين، مرةً ضمن Electronics ومرةً ضمن Books، لأن هاتين تركيبتان مختلفتان.
SELECT DISTINCT customer, category
FROM orders;كيفية التحقق من التفرد
تقارن قاعدة البيانات بين نسخ كاملة من الصفوف. ولكي يحذف DISTINCT صفًا، يجب أن تتطابق جميع الأعمدة في قائمة SELECT تمامًا مع صف سبق رصده.
في جدول orders لدينا، الصفان 3 و5 كلاهما (Bob, Electronics, UK)، أي إنهما متطابقان تمامًا في الأعمدة الثلاثة، ولذلك يُحذف أحدهما.
SELECT DISTINCT customer, category, country
FROM orders;
-- Row (Bob, Electronics, UK) appears only once
-- even though it occurs on rows 3 and 5لا تُحذف المطابقة الجزئية
لدى Alice صفان يحملان category = Electronics، لكن كليهما يحمل country = US. وبما أن الأعمدة الثلاثة محددة، فإن الصفين الأصليين متطابقان، لذا لا يبقى سوى أحدهما.
غيّر الأعمدة المحددة، وسيتغير اختبار التفرد أيضًا.
-- Select only customer + country
-- (Alice, US) appears twice in the table but DISTINCT keeps it once
SELECT DISTINCT customer, country
FROM orders;
-- Now add category back — uniqueness recalculated
SELECT DISTINCT customer, category, country
FROM orders;حالة استخدام واقعية: الأزواج الفريدة
من الأنماط الشائعة العثور على كل تركيبة فريدة من سمتين — مثل تحديد فئات المنتجات التي تُباع في كل دولة، بغض النظر عن عدد مرات حدوث كل عملية بيع.
SELECT DISTINCT category, country
FROM orders
ORDER BY category, country;الجمع بين DISTINCT وWHERE
يمكنكم تصفية الصفوف أولًا باستخدام WHERE، ثم يزيل DISTINCT التكرارات من النتيجة المصفّاة. تعمل العبارتان بشكل مستقل — إذ يضيّق WHERE نطاق البيانات، بينما يزيل DISTINCT التكرارات منها.
SELECT DISTINCT customer, category
FROM orders
WHERE country = 'US';DISTINCT في مقابل GROUP BY
تتمثل طريقة مكافئة للحصول على التركيبات الفريدة في استخدام GROUP BY. ينتج الأسلوبان النتيجة نفسها عند إزالة التكرارات فقط. ويظهر الفرق عندما تحتاجون إلى دوال التجميع: إذ يتيح لكم GROUP BY إضافة COUNT(*) وSUM() وغيرهما، بينما لا يتيح DISTINCT ذلك.
-- Using DISTINCT
SELECT DISTINCT customer, category
FROM orders;
-- Equivalent using GROUP BY
SELECT customer, category
FROM orders
GROUP BY customer, category;عدّ التركيبات الفريدة
يتيح لكم وضع DISTINCT متعدد الأعمدة داخل استعلام فرعي عدّ عدد التركيبات الفريدة الموجودة. وهذه طريقة مفيدة لقياس تنوّع بياناتكم.
SELECT COUNT(*) AS unique_customer_category_pairs
FROM (
SELECT DISTINCT customer, category
FROM orders
) AS deduped;خطأ شائع: ينطبق DISTINCT على جميع الأعمدة
من المفاهيم الخاطئة الشائعة أن DISTINCT ينطبق على العمود الأول المدرج فقط. وهذا غير صحيح. يأخذ DISTINCT دائمًا الصف بأكمله الناتج عن جميع الأعمدة المحددة في الاعتبار.
لا يمكنكم استخدام DISTINCT على بعض الأعمدة فقط مع الإبقاء على التكرارات في الأعمدة الأخرى — ولتحقيق ذلك، تحتاجون إلى دوال النوافذ مثل ROW_NUMBER().
-- This does NOT give distinct customers with any category
-- It gives distinct (customer, category) pairs
SELECT DISTINCT customer, category
FROM orders;
-- If you want one row per customer (any category), use:
SELECT customer, MIN(category) AS sample_category
FROM orders
GROUP BY customer;تحقق سريع
اختبروا مدى فهمكم لاستخدام DISTINCT مع عدة أعمدة.
مراجعة الدرس
أحسنتم! إليكم ما تعلمتموه عن استخدام DISTINCT مع عدة أعمدة:
- ينطبق DISTINCT على الصف بأكمله — إذ يجري التحقق من جميع الأعمدة المحددة معًا.
- لا يُستبعد الصف إلا عندما يطابق كل عمود فيه صفًا تمت رؤيته من قبل مطابقة تامة.
- تؤدي إضافة أعمدة إلى قائمة SELECT أو إزالتها منها إلى تغيير الصفوف التي تُعدّ مكررة.
- يمكنكم دمج DISTINCT مع WHERE وORDER BY بحرية.
- يُعد GROUP BY بديلًا مكافئًا، ويصبح مطلوبًا عند الحاجة إلى دوال التجميع أيضًا.
يتيح لكم إتقان DISTINCT متعدد الأعمدة استكشاف التركيبات الفريدة بكفاءة في أي مجموعة بيانات.
الأسئلة الشائعة
هل درس «DISTINCT على أعمدة متعددة» مجاني؟
نعم — نص درس «DISTINCT على أعمدة متعددة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «DISTINCT على أعمدة متعددة»؟
تحقّق من التفرد عبر مجموعات القيم تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «DISTINCT على أعمدة متعددة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات SELECT DISTINCT
- DISTINCT على أعمدة متعددة
- DISTINCT ON في PostgreSQL
- عدّ القيم الفريدة