0Pricing
SQL Academy · درس

عدّ القيم الفريدة

استخدم COUNT(DISTINCT ...) عمليًا

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

لماذا نعدّ القيم الفريدة؟

عند استخدام COUNT(*)، فإنكم تعدّون كل صف، بما في ذلك الصفوف المكررة. لكنكم قد ترغبون أحيانًا في معرفة عدد القيم الفريدة الموجودة في عمود ما فقط.

على سبيل المثال: من كم دولة مختلفة يأتي عملاؤكم؟ وكم منتجًا فريدًا طُلب في الشهر الماضي؟ هنا تأتي فائدة COUNT(DISTINCT ...).

إعداد جدول نموذجي

لننشئ جدول orders لنتدرّب عليه. يحتوي كل طلب على اسم عميل ومنتج ودولة.

لاحظوا أن بعض العملاء والدول يظهرون أكثر من مرة — وهذا مقصود، حتى نرى الفرق بين عدّ جميع الصفوف وعدّ القيم الفريدة.

CREATE TABLE orders (
  id INT,
  customer VARCHAR(50),
  product VARCHAR(50),
  country VARCHAR(50)
);

INSERT INTO orders VALUES
  (1, 'Alice', 'Laptop', 'USA'),
  (2, 'Bob', 'Phone', 'UK'),
  (3, 'Alice', 'Tablet', 'USA'),
  (4, 'Carol', 'Laptop', 'Canada'),
  (5, 'Bob', 'Laptop', 'UK'),
  (6, 'Dave', 'Phone', 'USA'),
  (7, 'Carol', 'Phone', 'Canada'),
  (8, 'Eve', 'Tablet', 'Germany');

COUNT(*) في مقابل COUNT(DISTINCT)

شغّلوا الاستعلامين وقارنوا النتائج. يعيد COUNT(*) القيمة 8 — قيمة واحدة لكل صف. ويعيد COUNT(DISTINCT customer) القيمة 5 — لأن هناك 5 عملاء فريدين فقط (Alice وBob وCarol وDave وEve).

هذه هي الفكرة الأساسية: يتجاهل COUNT(DISTINCT column) القيم المتكررة ويعدّ القيم الفريدة فقط.

SELECT COUNT(*) AS total_orders,
       COUNT(DISTINCT customer) AS unique_customers
FROM orders;

عدّ الدول الفريدة

لنعرف عدد الدول المختلفة التي يأتي منها عملاؤنا. فعلى الرغم من أن جدول orders يحتوي على 8 صفوف، فإن عدة صفوف تشترك في الدولة نفسها.

ستكون النتيجة 4 — USA وUK وCanada وGermany — بغض النظر عن عدد مرات ظهور كل منها.

SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;

عدّ المنتجات الفريدة

يمكننا تطبيق النمط نفسه على أي عمود. نعدّ هنا عدد المنتجات المختلفة التي طُلبت.

على الرغم من ظهور 'Laptop' ثلاث مرات و'Phone' ثلاث مرات، يُعدّ كل منتج مرة واحدة فقط. والإجابة هي 3: Laptop وPhone وTablet.

SELECT COUNT(DISTINCT product) AS unique_products
FROM orders;

استخدام COUNT(DISTINCT) مع WHERE

يمكنكم دمج COUNT(DISTINCT ...) مع عبارة WHERE لتقليص عدد الصفوف قبل العدّ. نعدّ هنا المنتجات الفريدة التي طلبها العملاء من USA فقط.

تُؤخذ في الاعتبار الصفوف التي يكون فيها country = 'USA' فقط، ثم نعدّ المنتجات الفريدة ضمن تلك الصفوف.

SELECT COUNT(DISTINCT product) AS usa_unique_products
FROM orders
WHERE country = 'USA';

COUNT(DISTINCT) مع GROUP BY

عند اقتران GROUP BY بـ COUNT(DISTINCT ...)، تحصلون على عدد القيم الفريدة لكل مجموعة. يجيب هذا الاستعلام عن السؤال التالي: كم عميلًا فريدًا أجرى طلبات في كل دولة؟

تُعالج كل مجموعة بشكل مستقل، لذلك تُزال التكرارات داخل المجموعة قبل العدّ.

SELECT country,
       COUNT(DISTINCT customer) AS unique_customers
FROM orders
GROUP BY country
ORDER BY unique_customers DESC;

عدّ القيم الفريدة في عدة أعمدة

يمكنكم استخدام عدة تعبيرات COUNT(DISTINCT ...) في عبارة SELECT نفسها. ويوفّر ذلك نظرة سريعة على الكاردينالية — أي عدد القيم الفريدة التي يحتوي عليها كل عمود — وكل ذلك في استعلام واحد.

تُعد الكاردينالية مقياسًا مفيدًا عند استكشاف مجموعة بيانات جديدة.

SELECT COUNT(DISTINCT customer) AS unique_customers,
       COUNT(DISTINCT product)  AS unique_products,
       COUNT(DISTINCT country)  AS unique_countries
FROM orders;

كيفية التعامل مع NULL

مثل COUNT(column) العادي، يتجاهل COUNT(DISTINCT column) قيم NULL. ولا تُعدّ NULL قيمة فريدة.

في هذا المثال، يحتوي صفّان على NULL في country. وتظل النتيجة 4 دول فريدة غير NULL، لا 5.

INSERT INTO orders VALUES
  (9,  'Frank', 'Phone',  NULL),
  (10, 'Grace', 'Laptop', NULL);

SELECT COUNT(DISTINCT country) AS unique_countries_no_null
FROM orders;

مقارنة COUNT(*) وCOUNT(col) وCOUNT(DISTINCT col)

من المفيد رؤية صيغ COUNT الثلاث جنبًا إلى جنب:

  • COUNT(*) — يعدّ كل صف، بما في ذلك الصفوف التي تحتوي على NULL
  • COUNT(country) — يعدّ الصفوف التي لا تكون فيها country بقيمة NULL
  • COUNT(DISTINCT country) — يعدّ قيم country الفريدة وغير NULL

شغّلوا هذا على الجدول المحدّث (الذي يحتوي الآن على 10 صفوف، اثنان منها يحتويان على NULL في country) للتأكد من الفروق.

SELECT COUNT(*)                AS total_rows,
       COUNT(country)          AS non_null_countries,
       COUNT(DISTINCT country) AS unique_countries
FROM orders;

حالة استخدام واقعية: المستخدمون النشطون يوميًا

من أكثر استخدامات COUNT(DISTINCT ...) شيوعًا في التحليلات عدّ المستخدمين النشطين يوميًا (DAU). لديكم سجل بالأحداث وتريدون معرفة عدد المستخدمين الفريدين النشطين كل يوم.

استخدموا GROUP BY على التاريخ وCOUNT(DISTINCT user_id) للحصول على عدد المستخدمين الفريدين لكل يوم — إذ تُستبعد تلقائيًا التكرارات الناتجة عن نقر المستخدم نفسه عدة مرات.

CREATE TABLE user_events (
  event_date DATE,
  user_id    INT
);

INSERT INTO user_events VALUES
  ('2024-01-01', 1), ('2024-01-01', 2), ('2024-01-01', 1),
  ('2024-01-02', 2), ('2024-01-02', 3), ('2024-01-02', 2),
  ('2024-01-03', 1), ('2024-01-03', 4);

SELECT event_date,
       COUNT(DISTINCT user_id) AS daily_active_users
FROM user_events
GROUP BY event_date
ORDER BY event_date;

تحقق سريع

اختبروا مدى فهمكم لـ COUNT(DISTINCT ...) من خلال هذا السؤال.

مراجعة الدرس

أحسنتم! إليكم ملخصًا لما تعلمتموه عن COUNT(DISTINCT ...):

  • يعدّ COUNT(DISTINCT column) القيم الفريدة وغير NULL فقط في العمود.
  • ويختلف عن COUNT(*) (جميع الصفوف) وCOUNT(column) (الصفوف غير NULL).
  • يعمل مع WHERE لتصفية الصفوف قبل العدّ.
  • يعمل مع GROUP BY لعدّ القيم الفريدة لكل مجموعة.
  • تُستبعد قيم NULL دائمًا من العدّ الفريد.
  • يمكن أن تظهر عدة تعبيرات COUNT(DISTINCT ...) في عبارة SELECT نفسها.
  • تشمل الاستخدامات الشائعة في العالم الواقعي عدّ المستخدمين والمنتجات والدول والجلسات الفريدة.

يمنحكم إتقان هذه الدالة أداة قوية لاستكشاف البيانات وتحليلها.

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

هل درس «عدّ القيم الفريدة» مجاني؟

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

ماذا ستتعلم في «عدّ القيم الفريدة»؟

استخدم COUNT(DISTINCT ...) عمليًا تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «عدّ القيم الفريدة»؟

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

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

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

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

  1. أساسيات SELECT DISTINCT
  2. DISTINCT على أعمدة متعددة
  3. DISTINCT ON في PostgreSQL
  4. عدّ القيم الفريدة
← العودة إلى SQL Academy