BETWEEN وIN والحدود الشاملة
حالات الحدود الطرفية وكيف يتعامل BETWEEN مع النهايات
BETWEEN وIN والحدود الشاملة درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
لماذا تكلّف الحدود المرشحين نقاطًا
تبدو عوامل تصفية النطاق والمجموعة بسيطة، لذلك يستغل المحاورون الحالات الحدية. تشمل BETWEEN كلا الحدين، ويخفي IN فخًا دقيقًا متعلقًا بـ NULL، أما نطاقات التواريخ فهي موضع أخطاء الانزياح بمقدار واحد التي تفسد التقارير بصمت.
يوضح هذا الدرس بدقة كيفية تعامل BETWEEN مع حدّيه، ومتى يكون IN أوضح من سلاسل OR، ونمط النطاق نصف المفتوح الذي يستخدمه المحترفون مع التواريخ.
BETWEEN شامل للطرفين
col BETWEEN a AND b هو صيغة مختصرة لـ col >= a AND col <= b. كلا الحدين مشمول.
لذلك يعيد price BETWEEN 10 AND 20 الصفوف التي يكون فيها السعر 10 تمامًا أو 20 تمامًا، بالإضافة إلى كل ما بينهما. أكثر إجابة خاطئة شيوعًا في المقابلات هي الادعاء بأن الحد الأعلى مستبعد.
SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;
-- equivalent to: price >= 10 AND price <= 20ترتيب الوسيطات مهم
يتطلب BETWEEN وضع القيمة الأصغر أولًا. يُوسَّع col BETWEEN 20 AND 10 إلى col >= 20 AND col <= 10، وهو شرط لا يمكن أن يكون صحيحًا، لذلك يعيد صفرًا من الصفوف بدلًا من حدوث خطأ.
هذا فخ مفضّل لدى المحاورين: يعمل الاستعلام دون أخطاء، ولا يعيد شيئًا، فيفترض المرشح أن البيانات فارغة. ضع الحد الأصغر أولًا دائمًا.
SELECT *
FROM products
WHERE price BETWEEN 20 AND 10;
-- returns NOTHING, not an errorخطأ الواحد في نطاق التاريخ
عند طلب جميع أيام يناير، يكتب كثير من المرشحين order_date BETWEEN '2024-01-01' AND '2024-01-31'. إذا كان order_date طابعًا زمنيًا، فإن هذا يسقط كل شيء بعد منتصف الليل في اليوم 31، لأن 2024-01-31 يعني 2024-01-31 00:00:00.
سيُستبعد طلب أُجري في الساعة الثانية بعد الظهر من يوم 31 يناير. يعمل هذا مع أعمدة DATE الخالصة، لكن لا يمكنك افتراض نوع العمود.
SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- silently excludes Jan 31 afternoon if order_date is a timestampإصلاح النطاق نصف المفتوح
النمط المهني للتواريخ هو فترة نصف مفتوحة: أكبر من أو يساوي تاريخ البداية، وأصغر تمامًا من بداية الفترة التالية. وهذا صحيح مع كل من DATE وTIMESTAMP، ولا يتطلب معرفة دقة الوقت في العمود.
لاحظ أن الحد الأعلى هو اليوم الأول من فبراير، وليس اليوم الأخير من يناير. وبهذا يشمل كل لحظة زمنية في يناير.
SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
AND order_date < '2024-02-01';NOT BETWEEN
يُوسَّع col NOT BETWEEN a AND b إلى col < a OR col > b. وهو يستبعد كلا الحدين وكل ما بينهما.
انتبه: إذا كانت قيمة col هي NULL، فإن NOT BETWEEN يُقيَّم إلى UNKNOWN، لذلك تُستبعد صفوف NULL كما يحدث مع BETWEEN العادي. لا تحقق قيم NULL اختبار نطاق في أي من الاتجاهين.
SELECT *
FROM products
WHERE price NOT BETWEEN 10 AND 20;
-- price < 10 OR price > 20IN لاختبار الانتماء إلى مجموعة
col IN (a, b, c) هو صيغة مختصرة لـ col = a OR col = b OR col = c. وهذه هي الطريقة الواضحة لاختبار الانتماء إلى مجموعة صغيرة وثابتة.
يُقرأ بصورة أفضل من سلسلة من OR، ويتجنب تمامًا مشكلة وضع الأقواس الخاصة بالأسبقية، لأن اختبار المجموعة بأكمله يمثل شرطًا واحدًا.
SELECT *
FROM orders
WHERE status IN ('pending', 'shipped', 'delivered');فخ NULL مع NOT IN
هذا هو السؤال الأكثر إثارة للقلق حول IN. إذا احتوت القائمة أو الاستعلام الفرعي وراء NOT IN على قيمة NULL واحدة، فقد يُقيَّم الشرط بأكمله إلى UNKNOWN ويعيد صفرًا من الصفوف.
والسبب هو أن x NOT IN (1, NULL) تصبح x <> 1 AND x <> NULL، وأن x <> NULL لا تكون صحيحة أبدًا، بل تكون UNKNOWN. لذلك لا يمكن أن يكون شرط AND بأكمله صحيحًا.
SELECT *
FROM employees
WHERE manager_id NOT IN (SELECT id FROM managers);
-- returns NOTHING if any managers.id is NULLإصلاح NOT IN
هناك إصلاحان موثوقان لفخ NULL مع NOT IN:
- صفِّ قيم NULL من الاستعلام الفرعي باستخدام
WHERE id IS NOT NULL - والأفضل إعادة كتابته باستخدام
NOT EXISTS، الذي يتعامل مع قيم NULL بشكل صحيح بطبيعته
يعدّ المحاورون استخدام NOT EXISTS إجابة بمستوى خبير، لأنه يتجاوز الفخ تمامًا وغالبًا ما ينتج خطة تنفيذ أفضل.
SELECT e.*
FROM employees e
WHERE NOT EXISTS (
SELECT 1 FROM managers m WHERE m.id = e.manager_id
);IN مع استعلام فرعي
يقبل IN استعلامًا فرعيًا يعيد عمودًا واحدًا. يُبقي WHERE customer_id IN (SELECT customer_id FROM vip) الصفوف التي يكون عميلها ضمن مجموعة VIP.
إن استخدام IN العادي، وليس NOT IN، آمن مع قيم NULL في الاستعلام الفرعي: فقيمة NULL في القائمة لا تطابق شيئًا ببساطة، لكنها لا تفسد الصفوف التي تحقق تطابقًا. يقتصر الفخ على NOT IN.
SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM vip_customers);IN متعدد الأعمدة باستخدام منشئات الصفوف
سؤال متابعة شائع: كيف تطابقون أكثر من عمود في آن واحد؟ مرّروا صفًا إلى IN باستخدام منشئ صفوف؛ فهو يقارن الأعمدة موضعيًا، ويكون أوضح بكثير من تكرار OR (a = .. AND b = ..).
- يُقرأ بوضوح ويتوسع بسهولة إلى قوائم سماح طويلة.
- يجب أن يسرد كل صف الأعمدة بالترتيب نفسه.
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));تحقق سريع
تذكّر كيفية تعامل BETWEEN مع حدّيه.
خلاصة
أهم النقاط:
- يشمل
BETWEEN a AND bكلا الحدين؛ ويجب أن يأتي الحد الأصغر أولًا، وإلا حصلت على صفر من الصفوف - استخدم مع نطاقات الطوابع الزمنية فترة نصف مفتوحة:
>= start AND < next_period - يمثل
INاختبارًا واضحًا للانتماء إلى مجموعة، وهو آمن مع قيم NULL - يعيد
NOT INلا شيء عند وجود أي قيمةNULLفي القائمة؛ أعد كتابته باستخدامNOT EXISTS
الفكرة المتكررة هي أن عامل التصفية قد يعمل بصورة مثالية، ومع ذلك يعيد الصفوف الخاطئة بهدوء.
الأسئلة الشائعة
هل درس «BETWEEN وIN والحدود الشاملة» مجاني؟
نعم — نص درس «BETWEEN وIN والحدود الشاملة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «BETWEEN وIN والحدود الشاملة»؟
حالات الحدود الطرفية وكيف يتعامل BETWEEN مع النهايات تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟
لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «BETWEEN وIN والحدود الشاملة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟
نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أسبقية AND وOR ووضع الأقواس
- BETWEEN وIN والحدود الشاملة
- LIKE والرموز البديلة وهروب المحارف
- التصفية حسب القيم المحسوبة