0Pricing
SQL Academy · درس

IN وNOT IN للمجموعات

رشّح وفق قوائم قيم باستخدام IN وNOT IN، وتعلّم مشكلة NULL في NOT IN، وحوّلها إلى EXISTS للحصول على دلالات آمنة.

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

IN: المطابقة مقابل قائمة

يُعد IN اختصارًا لعدة عوامل OR:

SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');

-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';

استخدام IN مع استعلام فرعي

يمكنكم استخدام استعلام فرعي في الجهة اليمنى:

SELECT * FROM orders
WHERE user_id IN (
  SELECT id FROM users WHERE country = 'US'
);

NOT IN: استبعاد قائمة

صفّوا الصفوف المطابقة واستبعدوها:

SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');

مشكلة NULL في NOT IN

إذا احتوت الجهة اليمنى على NULL، فإن NOT IN تُرجع NULL، وتُحذف الصفوف التي يكون شرطها NULL. والنتيجة: صفر من الصفوف.

-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently

-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);

لماذا يكون NOT EXISTS أكثر أمانًا

يستخدم NOT EXISTS دلالات الاستعلام الفرعي المترابط القياسية، ويكون آمنًا مع NULL. وغالبًا ما تحسّنه معظم المخططات بالطريقة نفسها التي تحسّن بها NOT IN المصاغة جيدًا.

IN مقابل OR — سهولة القراءة

يتفوق IN على سلاسل OR الطويلة من حيث الوضوح، وغالبًا ما يحسّنه المخطط بالطريقة نفسها:

-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...

-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)

استخدام IN مع الصفوف المركبة

طابقوا أزواج الأعمدة:

SELECT * FROM order_items
WHERE (order_id, product_id) IN (
  (1, 42), (2, 99), (3, 17)
);

استخدام الفهارس

يمكن تنفيذ قائمة IN على عمود مفهرس باعتبارها عمليات بحث متعددة في الفهرس (Bitmap Index Scan). وتكون سريعة عمومًا.

-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);

قوائم IN الكبيرة

قد تصبح القوائم التي تحتوي على آلاف القيم بطيئة. يُفضّل استخدام:

  • JOIN مع جدول حقيقي أو مؤقت
  • = ANY(array) لتمرير مَعلمة مصفوفة
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);

استخدام IN مع قائمة فارغة

قائمة IN الفارغة غير قانونية في SQL القياسي. تمرّر بعض العملاء قيمة مميّزة بدلًا منها؛ لذا يكون إنشاء شرط SQL بشكل مشروط أكثر أمانًا.

-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.

IN مقابل JOIN

يكون JOIN أحيانًا أوضح من استخدام IN مع استعلام فرعي:

-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);

-- With JOIN:
SELECT o.*
FROM orders o
JOIN users  u ON u.id = o.user_id
WHERE u.pro;

مراجعة

يُعد IN الصيغة السهلة للتحقق من عضوية مجموعة.

  • استخدموا IN بدلًا من OR لتحسين سهولة القراءة
  • يكون NOT IN خطيرًا مع NULL — لذا يُفضّل استخدام NOT EXISTS
  • للمجموعات الكبيرة، استخدموا JOIN أو مرّروا مصفوفات

تحقق سريع

ما البديل الأكثر أمانًا لـ NOT IN (subquery) عندما قد يحتوي الاستعلام الفرعي على قيم NULL؟

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

هل درس «IN وNOT IN للمجموعات» مجاني؟

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

ماذا ستتعلم في «IN وNOT IN للمجموعات»؟

رشّح وفق قوائم قيم باستخدام IN وNOT IN، وتعلّم مشكلة NULL في NOT IN، وحوّلها إلى EXISTS للحصول على دلالات آمنة. تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «IN وNOT IN للمجموعات»؟

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

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

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

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

  1. أنماط LIKE والمحارف البديلة
  2. IN وNOT IN للمجموعات
  3. BETWEEN للنطاقات
  4. IS NULL وIS NOT NULL وCOALESCE
← العودة إلى SQL Academy