IN مقابل ANY مقابل ALL
قارن القيم بمجموعات من القيم
IN مقابل ANY مقابل ALL درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
ما المقصود بـ IN وANY وALL؟
عند كتابة استعلامات SQL، تحتاجون غالبًا إلى مقارنة قيمة مع مجموعة من القيم. ويوفر SQL ثلاثة عوامل قوية لهذا الغرض: IN وANY وALL.
يمكن للعوامل الثلاثة العمل مع استعلامات فرعية تُعيد قائمة من القيم. وتبدو متشابهة، لكنها تتصرف بطرق مختلفة — ويمكن لاختيار العامل المناسب أن يجعل الاستعلام أكثر تعبيرًا وكفاءة.
عامل IN
يتحقق عامل IN مما إذا كانت قيمة ما تطابق أي قيمة في قائمة أو في نتيجة استعلام فرعي. وهو أبسط العوامل الثلاثة.
يسترد المثال أدناه الموظفين الذين يعملون في أقسام المبيعات أو الموارد البشرية أو الهندسة.
SELECT name, department
FROM employees
WHERE department IN ('Sales', 'HR', 'Engineering');IN مع استعلام فرعي
يصبح IN قويًا بشكل خاص عند استخدامه مع استعلام فرعي. فبدلًا من استخدام قائمة ثابتة، يمكنكم جلب قيم المقارنة مباشرةً من جدول آخر.
نبحث هنا عن جميع الموظفين الذين ينتمون إلى قسم تتجاوز ميزانيته 100,000.
SELECT name, department
FROM employees
WHERE department IN (
SELECT dept_name
FROM departments
WHERE budget > 100000
);عامل ANY
يقارن ANY (ويُكتب أيضًا SOME) قيمةً بكل قيمة يُعيدها استعلام فرعي، باستخدام عامل مقارنة مثل = أو > أو < أو >= أو <=.
يكون الشرط صحيحًا إذا كانت المقارنة صحيحة بالنسبة إلى قيمة واحدة على الأقل من نتيجة الاستعلام الفرعي.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department = 'HR'
);= ANY مماثل لـ IN
من المهم معرفة التكافؤ التالي: إن = ANY (subquery) مطابق منطقيًا لـ IN (subquery). فكلاهما يُعيد القيمة true عندما تطابق القيمة نتيجة واحدة على الأقل من الاستعلام الفرعي.
يُنتج هذان الاستعلامان النتيجة نفسها:
-- Using IN
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'NYC');
-- Using = ANY
SELECT name FROM employees
WHERE department_id = ANY (SELECT id FROM departments WHERE location = 'NYC');عامل ALL
يقارن ALL قيمةً بكل قيمة في نتيجة استعلام فرعي. ولا يكون الشرط صحيحًا إلا إذا انطبق عامل المقارنة على جميع القيم المُعادة.
يعثر هذا المثال على الموظفين الذين يتجاوز راتبهم كل راتب في فئة المتدربين — أي أنهم يتقاضون أكثر من أعلى راتب بين المتدربين.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary
FROM employees
WHERE job_grade = 'Intern'
);مقارنة ANY وALL — جنبًا إلى جنب
يتمثل الفرق الأساسي في أن ANY يتطلب أن يكون الشرط صحيحًا بالنسبة إلى قيمة واحدة على الأقل، بينما يتطلب ALL أن يكون صحيحًا بالنسبة إلى كل قيمة.
فكروا في الأمر بهذه الطريقة: يشبه ANY استخدام OR مع جميع المقارنات، ويشبه ALL استخدام AND مع جميع المقارنات.
-- Returns rows where salary > at least one value in the subquery
SELECT name, salary FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE department = 'Support');
-- Returns rows where salary > every value in the subquery
SELECT name, salary FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE department = 'Support');مقارنة NOT IN بـ <> ALL
مثلما يحاكي = ANY العامل IN، فإن العامل <> ALL مكافئ لـ NOT IN. فكلاهما يُعيد القيمة true فقط عندما لا تطابق القيمة أي قيمة في الاستعلام الفرعي.
لكن توخوا الحذر — فإذا أعاد الاستعلام الفرعي قيمة NULL واحدة فقط، فلن يُعيد NOT IN أي صفوف على الإطلاق بسبب منطق SQL ذي القيم الثلاث.
-- Using NOT IN
SELECT name FROM employees
WHERE department_id NOT IN (SELECT id FROM departments WHERE location = 'Remote');
-- Using <> ALL (equivalent)
SELECT name FROM employees
WHERE department_id <> ALL (SELECT id FROM departments WHERE location = 'Remote');فخ NULL مع NOT IN
تتمثل إحدى المشكلات المهمة في أنه إذا أعاد الاستعلام الفرعي المستخدم مع NOT IN قيمة NULL، فسيُقيّم شرط NOT IN بأكمله إلى UNKNOWN لكل صف، ما يؤدي إلى نتيجة فارغة.
لتجنب ذلك، صفّوا قيم NULL من الاستعلام الفرعي، أو استخدموا NOT EXISTS بدلًا منه — إذ يتعامل مع قيم NULL بأمان.
-- Dangerous: if manager_id has any NULL, no rows are returned
SELECT name FROM employees
WHERE id NOT IN (SELECT manager_id FROM employees);
-- Safe: filter NULLs explicitly
SELECT name FROM employees
WHERE id NOT IN (
SELECT manager_id FROM employees
WHERE manager_id IS NOT NULL
);مثال عملي: العثور على أصحاب الرواتب المرتفعة
لنرَ كيفية تطبيق العوامل الثلاثة على سيناريو واقعي. لدينا جدول employees يحتوي على أعمدة name وdepartment وsalary.
نريد الموظفين الذين يتقاضون أكثر من متوسط راتب أي قسم منفرد — أي أكثر من متوسط راتب قسم واحد على الأقل.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT AVG(salary)
FROM employees
GROUP BY department
)
ORDER BY salary DESC;متى تستخدمون كل عامل؟
إليكم دليلًا سريعًا لاختيار العامل المناسب من بين العوامل الثلاثة:
- IN — عند وجود قائمة ثابتة أو الحاجة إلى مطابقة بسيطة للتساوي مع استعلام فرعي.
- = ANY — يساوي IN، لكنه يتيح استخدام عوامل مقارنة أخرى مثل
>و<. - ALL — عندما يجب أن ينطبق الشرط على كل قيمة، مثل أن تكون القيمة أكبر من القيمة العظمى دون استخدام MAX.
- NOT IN — مريح في الاستخدام، لكن انتبهوا إلى قيم NULL؛ وفضّلوا
NOT EXISTSعندما قد يحتوي الاستعلام الفرعي على قيم NULL.
اختبار سريع
اختبروا فهمكم لـ IN وANY وALL.
مراجعة الدرس
تعلمتم في هذا الدرس كيفية مقارنة القيم مع مجموعة باستخدام IN وANY وALL.
أهم النقاط:
- يتحقق
INمن العضوية — ويكون صحيحًا إذا طابقت القيمة أي عنصر في القائمة أو الاستعلام الفرعي. - يكافئ
= ANYالعاملIN؛ أما استخدام عوامل أخرى مثل> ANYفيعني أن الشرط يكون صحيحًا بالنسبة إلى تطابق واحد على الأقل. - يعني
ALLأن الشرط يجب أن ينطبق على كل قيمة يُعيدها الاستعلام الفرعي. - يُعيد
NOT INبصمتٍ صفر صفوف عندما يحتوي الاستعلام الفرعي على قيم NULL — لذا احرصوا دائمًا على معالجة هذه الحالة. - استخدموا
NOT EXISTSبديلًا أكثر أمانًا لـNOT INعند احتمال وجود قيم NULL.
الأسئلة الشائعة
هل درس «IN مقابل ANY مقابل ALL» مجاني؟
نعم — نص درس «IN مقابل ANY مقابل ALL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «IN مقابل ANY مقابل ALL»؟
قارن القيم بمجموعات من القيم تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «IN مقابل ANY مقابل ALL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الاستعلامات الفرعية المترابطة
- EXISTS وNOT EXISTS
- IN مقابل ANY مقابل ALL
- أداء EXISTS مقابل JOIN