0Pricing
SQL Interview Prep · درس

DISTINCT مقابل GROUP BY للتفرّد

متى تكون DISTINCT هي الإجابة الصحيحة ومتى يتوقع مسؤول المقابلة استخدام GROUP BY بدلًا منها

DISTINCT مقابل GROUP BY للتفرّد درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.

ما الذي تفعله DISTINCT

تزيل DISTINCT الصفوف المكررة. والنقطة الأساسية التي يتحقق منها المحاورون هي أنها تعمل على الصف المحدد بأكمله، لا على عمود واحد؛ لذلك يزيل SELECT DISTINCT a, b التكرارات من الزوج (a, b).

SELECT DISTINCT department
FROM employees;

تمتد DISTINCT إلى جميع الأعمدة المحددة

عند تحديد عدة أعمدة، تحتفظ DISTINCT بكل تركيبة فريدة، أي بصف واحد لكل زوج مميز من (department, job_title). ولا توجد طريقة قياسية لإزالة التكرارات من عمود واحد فقط.

SELECT DISTINCT department, job_title
FROM employees;

ما الذي تفعله GROUP BY

تدمج GROUP BY الصفوف التي تشترك في المفتاح نفسه في صف واحد لكل مجموعة. وبمفردها، تعطي عملية التجميع حسب عمود النتيجة نفسها التي تعطيها DISTINCT عليه.

SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;

الفرق الحقيقي: التجميع

متى يختلفان إذن؟ عندما تحتاج إلى تجميع. تستطيع GROUP BY حساب COUNT أو SUM أو AVG لكل مجموعة، بينما لا تستطيع DISTINCT ذلك. هل تحتاج إلى صفوف فريدة؟ استخدم DISTINCT. هل تحتاج إلى مقياس لكل مجموعة؟ استخدم GROUP BY.

SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

لا تستطيع DISTINCT إجراء العد لكل مجموعة

لا يمكنك إضافة العد إلى DISTINCT. وللإجابة عن سؤال «كم عدد الموظفين في كل قسم؟»، تكون الأداة الصحيحة دائمًا هي GROUP BY مع COUNT(*)، وليس SELECT DISTINCT.

-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;

-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

تجمع COUNT(DISTINCT) بين الفكرتين

من التركيبات المفيدة: تحسب COUNT(DISTINCT col) عدد القيم الفريدة داخل كل مجموعة. هنا توجد DISTINCT داخل دالة التجميع، لتجيب عن سؤال «كم عدد المسميات الوظيفية المختلفة في كل قسم؟».

SELECT department,
       COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;

عدّ القيم الفريدة إجمالًا

من دون GROUP BY، تحسب COUNT(DISTINCT col) عدد القيم الفريدة في الجدول بأكمله، وهي إجابة مباشرة عن سؤال «كم عدد الأقسام المختلفة لدينا؟».

SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;

-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;

غالبًا لا يُحدث الأداء فرقًا

أيهما أسرع: DISTINCT أم GROUP BY؟ عند إزالة التكرارات فقط، تكون النتيجة عادةً متكافئة؛ إذ يخطط المحسّنون لهما بالطريقة نفسها. اختر بناءً على الغرض: DISTINCT للصفوف الفريدة، وGROUP BY عند إجراء التجميع.

DISTINCT وNULL

كيف تتعامل DISTINCT مع NULL؟ تعتبر جميع قيم NULL متساوية، ولذلك تندمج صفوف NULL المتعددة في صف واحد. وتفعل GROUP BY الشيء نفسه، إذ تشكل قيم NULL مجموعة واحدة.

-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;

‏DISTINCT ON في Postgres (إضافة)

إضافة: يوفّر Postgres صيغة غير قياسية هي DISTINCT ON (expr)، وتحتفظ بالصف الأول لكل مفتاح وفقًا لـ ORDER BY. أما الشيفرة القابلة للنقل فتستخدم ROW_NUMBER() بدلًا من ذلك.

-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;

تنطبق DISTINCT على SELECT بأكمله، لا على عمود واحد

إليك مشكلة أخرى: تعمل DISTINCT على الصف بأكمله، ولذلك لن يعطي SELECT DISTINCT customer_id, order_date صفًا واحدًا لكل عميل. استخدم لهذا الغرض GROUP BY مع MAX أو دالة نافذة.

-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;

-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;

اختبار سريع

اختر الأداة المناسبة.

مراجعة

مراجعة: تزيل DISTINCT التكرارات من الصفوف بأكملها، بينما تدمج GROUP BY الصفوف حسب المفتاح وتتيح دوال التجميع. تحسب COUNT(DISTINCT col) القيم الفريدة، وتتعامل كلتاهما مع NULL على أنها قيمة واحدة، وغالبًا لا يُحدث الأداء فرقًا.

الأسئلة الشائعة

هل درس «DISTINCT مقابل GROUP BY للتفرّد» مجاني؟

نعم — نص درس «DISTINCT مقابل GROUP BY للتفرّد» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «DISTINCT مقابل GROUP BY للتفرّد»؟

متى تكون DISTINCT هي الإجابة الصحيحة ومتى يتوقع مسؤول المقابلة استخدام GROUP BY بدلًا منها تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟

لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «DISTINCT مقابل GROUP BY للتفرّد»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟

نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إسقاط الأعمدة ومشكلات التسمية المستعارة
  2. الأعمدة المحسوبة وأسبقية التعبيرات
  3. DISTINCT مقابل GROUP BY للتفرّد
  4. تعبيرات CASE في SELECT
← العودة إلى SQL Interview Prep