الاستعلامات الفرعية باستخدام IN وANY وALL
الاستعلامات الفرعية لعضوية المجموعات وفخ NOT IN مع NULL الشهير
الاستعلامات الفرعية باستخدام IN وANY وALL درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
الاستعلامات الفرعية لعضوية المجموعات
عندما يعيد الاستعلام الفرعي قائمة من القيم، تختبرون العضوية فيها باستخدام IN أو ANY أو ALL. بهذه العوامل تسأل SQL: هل توجد هذه القيمة في تلك المجموعة؟ أو هل تتفوق على أي عنصر من تلك المجموعة أو على جميع عناصرها؟
IN— يطابق أي قيمة في القائمة.ANY/SOME— تكون النتيجة صحيحة إذا تحقق شرط المقارنة لعنصر واحد على الأقل.ALL— تكون النتيجة صحيحة فقط إذا تحقق الشرط لكل عنصر.
استخدام IN مع استعلام فرعي
الحالة الشائعة: اعثروا على الموظفين الذين يعملون في أي قسم يقع في 'NYC'. يعيد الاستعلام الفرعي مجموعة من معرّفات الأقسام، ويُبقي IN الصفوف التي تطابق أيًّا منها.
هذه الصياغة طبيعية، وهي أول صيغة يتوقعها المحاورون.
SELECT name
FROM employees
WHERE dept_id IN (
SELECT id FROM departments WHERE city = 'NYC'
);= ANY مكافئ لـ IN
تكافؤ لطيف يحبه المحاورون: يعني = ANY (subquery) الشيء نفسه تمامًا الذي يعنيه IN (subquery). فكلاهما يكون صحيحًا عندما تساوي القيمة عنصرًا واحدًا على الأقل من المجموعة.
يعيد الاستعلام أدناه النتيجة نفسها تمامًا التي أعادها الاستعلام السابق. ويعمّم ANY ومرادفه SOME هذا السلوك على عوامل أخرى مثل > و<.
SELECT name
FROM employees
WHERE dept_id = ANY (
SELECT id FROM departments WHERE city = 'NYC'
);استخدام ANY مع عامل مقارنة
تزداد قوة ANY عند استخدامه مع > أو <. تكون salary > ANY (set) صحيحة إذا تجاوز الراتب أصغر عنصر على الأقل — أي إذا كان أكبر من الحد الأدنى.
يُستخدم ذلك للعثور على الموظفين الذين يكسبون أكثر من شخص واحد على الأقل في القسم 5.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary FROM employees WHERE dept_id = 5
);استخدام ALL مع عامل مقارنة
تكون salary > ALL (set) صحيحة فقط إذا تجاوز الراتب كل عنصر — أي إذا كان أكبر من الحد الأقصى. ويعثر هذا على الموظفين الذين يتقاضون أكثر من الجميع في القسم 5.
احفظوا الاختصار التالي: > ALL = أكبر من MAX، و> ANY = أكبر من MIN. يختبر المحاورون هذا الأمر باستمرار.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary FROM employees WHERE dept_id = 5
);NOT IN: فخ NULL الشهير
إليكم أكثر نقطة خادعة يُسأل عنها في مقابلات الاستعلامات الفرعية. إذا أعاد الاستعلام الفرعي في NOT IN قيمة NULL واحدة ولو، فقد يعيد تعبير NOT IN بأكمله لا صفوف — وليس الصفوف اليتيمة التي توقعتموها.
لماذا؟ يتوسع x NOT IN (1, 2, NULL) إلى x <> 1 AND x <> 2 AND x <> NULL. وتكون المقارنة الأخيرة UNKNOWN، لذلك لا يمكن أن يكون التعبير AND صحيحًا.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
);لماذا يتعطل ذلك الاستعلام بصمت
إذا كان orders.customer_id يسمح بقيم NULL وكان أي صف يحتوي على NULL فيه، فسيعيد الاستعلام السابق صفرًا من الصفوف، حتى مع وجود عملاء بلا طلبات بوضوح.
- يحوّل وجود NULL المنطق إلى
UNKNOWN. - لا يحدث خطأ — بل يعيد نتائج خاطئة وفارغة فحسب.
إن التنبيه إلى هذا الخطر صراحةً أثناء المقابلة يعطي انطباعًا قويًا.
إصلاح NOT IN عند وجود NULL
ثلاثة إصلاحات آمنة يقبلها المحاورون:
- استبعاد قيم NULL من الاستعلام الفرعي: أضيفوا
WHERE customer_id IS NOT NULL. - إعادة كتابة الاستعلام باستخدام
NOT EXISTS، الذي يتعامل مع NULL بصورة صحيحة. - استخدام عملية anti-join عبر
LEFT JOIN ... IS NULL.
تعيد النسخة التي تتضمن هذا الشرط أدناه القائمة الفعلية للعملاء الذين ليس لديهم طلبات.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
WHERE customer_id IS NOT NULL
);IN يتعامل جيدًا مع NULL
نقطة مقابلة مطمئنة: لا يتعطل IN العادي، غير المنفي، بسبب قيم NULL في القائمة. يكون x IN (1, 2, NULL) صحيحًا إذا ساوى x القيمة 1 أو 2؛ أما NULL فلا يطابق شيئًا.
يكمن خطر NULL تحديدًا في NOT IN. ومعرفة الفرق بين الحالتين هي بالضبط ما يميز الإجابة الواثقة عن التخمين.
IN متعدد الأعمدة
تسمح بعض لهجات SQL، مثل Postgres وMySQL، باستخدام IN مع صف من الأعمدة لمطابقة الأزواج دفعة واحدة. ويعثر ذلك على بنود الطلبات التي يظهر زوجها (المنتج، المنطقة) في جدول العروض الترويجية.
لا يدعم SQL Server استخدام IN مع قيم الصفوف؛ لذا ستعيدون كتابة الاستعلام باستخدام EXISTS هناك. وذكر هذا الاختلاف في قابلية النقل يثير إعجاب المحاورين.
SELECT *
FROM order_lines
WHERE (product_id, region) IN (
SELECT product_id, region FROM promotions
);عبارة جاهزة للمقابلة
قولوا: "يختبر IN عضوية المجموعة، وهو مكافئ لـ = ANY. ومع عوامل المقارنة، يعني > ANY أن القيمة أكبر من الحد الأدنى، بينما يعني > ALL أنها أكبر من الحد الأقصى. والفخ الأكبر هو استخدام NOT IN مع استعلام فرعي قد يعيد NULL — إذ يعيد بصمت لا صفوف، لذلك أستخدم IS NOT NULL كحماية أو أتحول إلى NOT EXISTS."
تغطي هذه الإجابة عضوية المجموعات، ودلالات ANY وALL، وفخ NULL دفعة واحدة.
تحقق سريع
الفخ المفضل للمحاورين في الاستعلامات الفرعية.
مراجعة
الاستعلامات الفرعية لعضوية المجموعات، بعد إتقانها:
IN== ANY: يطابق أي عنصر في المجموعة.- يعني
> ANYأن القيمة أكبر من الحد الأدنى، بينما يعني> ALLأنها أكبر من الحد الأقصى. - يعيد
NOT INبصمت لا صفوف إذا وُجدت قيمة NULL في الاستعلام الفرعي — لذا احموا الاستعلام باستخدامIS NOT NULLأو استخدمواNOT EXISTS. - يتحمل
INالعادي قيم NULL؛ ويعملINمتعدد الأعمدة في بعض اللهجات.
التالي: EXISTS مقابل IN، وسؤال الأداء الذي يحب المحاورون ذوو الخبرة طرحه.
الأسئلة الشائعة
هل درس «الاستعلامات الفرعية باستخدام IN وANY وALL» مجاني؟
نعم — نص درس «الاستعلامات الفرعية باستخدام IN وANY وALL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «الاستعلامات الفرعية باستخدام IN وANY وALL»؟
الاستعلامات الفرعية لعضوية المجموعات وفخ NOT IN مع NULL الشهير تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟
لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الاستعلامات الفرعية باستخدام IN وANY وALL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟
نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الاستعلامات الفرعية العددية في SELECT وWHERE
- الاستعلامات الفرعية في عبارة FROM (الجداول المشتقة)
- الاستعلامات الفرعية باستخدام IN وANY وALL
- أداء EXISTS مقابل IN