معاملات IN و BETWEEN في SQL

في الدروس السابقة، تعلمنا كيفية تصفية البيانات باستخدام معاملات المقارنة والبحث بالأنماط. في هذا الدرس الشامل من سلسلة تعلم لغة SQL باللغة العربية، سنتعلم طريقتين قويتين لتصفية البيانات: IN للبحث في قوائم محددة من القيم، و BETWEEN للبحث في نطاقات (ranges). هذه الأدوات ستجعل استعلاماتك أكثر وضوحاً وفعالية.

1. معامل IN في SQL: البحث في القوائم

معامل IN يُستخدم للتحقق من وجود قيمة ضمن قائمة محددة من القيم. بدلاً من كتابة عدة شروط OR، يمكنك استخدام IN لجعل الكود أقصر وأوضح.

البنية الأساسية
SELECT column1, column2
FROM table_name
WHERE column_name IN (value1, value2, value3, ...);
تشبيه: فكر في IN كقائمة مدعوين لحفلة - إذا كان اسمك في القائمة، يمكنك الدخول!
مثال: بدون IN (طريقة طويلة)
استخدام OR المتكرر
SELECT name, city FROM students
WHERE city = 'الرياض' OR city = 'جدة' OR city = 'مكة';
نفس المثال: مع IN (طريقة أفضل)
استخدام IN (أقصر وأوضح)
SELECT name, city FROM students
WHERE city IN ('الرياض', 'جدة', 'مكة');
ميزة: الاستعلام الثاني أقصر، أسهل في القراءة، وأسهل في الصيانة!

2. أمثلة عملية على IN

لنفترض أن لدينا جدول الطلاب:

جدول students
+----+-----------+-----+--------+--------+
| id | name      | age | city   | grade  |
+----+-----------+-----+--------+--------+
| 1  | أحمد      | 20  | الرياض | A      |
| 2  | فاطمة     | 19  | جدة    | B      |
| 3  | محمد      | 21  | الرياض | A      |
| 4  | سارة      | 20  | مكة    | C      |
| 5  | علي       | 22  | جدة    | B      |
| 6  | نورة      | 19  | الدمام | A      |
+----+-----------+-----+--------+--------+
مثال 1: البحث عن طلاب من مدن محددة
طلاب من الرياض أو جدة
SELECT name, city FROM students
WHERE city IN ('الرياض', 'جدة');
النتيجة
+-----------+--------+
| name      | city   |
+-----------+--------+
| أحمد      | الرياض | ✓
| فاطمة     | جدة    | ✓
| محمد      | الرياض | ✓
| علي       | جدة    | ✓
+-----------+--------+
4 rows in set
مثال 2: البحث عن درجات محددة
طلاب بدرجة A أو B
SELECT name, grade FROM students
WHERE grade IN ('A', 'B');
النتيجة
+-----------+--------+
| name      | grade  |
+-----------+--------+
| أحمد      | A      | ✓
| فاطمة     | B      | ✓
| محمد      | A      | ✓
| علي       | B      | ✓
| نورة      | A      | ✓
+-----------+--------+
5 rows in set
مثال 3: IN مع الأرقام
أعمار محددة
SELECT name, age FROM students
WHERE age IN (19, 20);
النتيجة
+-----------+-----+
| name      | age |
+-----------+-----+
| أحمد      | 20  | ✓
| فاطمة     | 19  | ✓
| سارة      | 20  | ✓
| نورة      | 19  | ✓
+-----------+-----+
4 rows in set

3. NOT IN: الاستبعاد من القائمة

يمكنك استخدام NOT IN لاستبعاد القيم الموجودة في القائمة.

مثال: جميع الطلاب ما عدا الرياض وجدة
استبعاد مدن
SELECT name, city FROM students
WHERE city NOT IN ('الرياض', 'جدة');
النتيجة
+-----------+--------+
| name      | city   |
+-----------+--------+
| سارة      | مكة    | ✓
| نورة      | الدمام | ✓
+-----------+--------+
2 rows in set

4. معامل BETWEEN في SQL: البحث في النطاقات

معامل BETWEEN يُستخدم للبحث عن قيم ضمن نطاق محدد (من قيمة إلى قيمة). يعمل مع الأرقام، التواريخ، والنصوص.

البنية الأساسية
SELECT column1, column2
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
مهم: BETWEEN يشمل القيمتين الحدية (inclusive). أي أن BETWEEN 10 AND 20 يشمل 10 و 20.
مثال: بدون BETWEEN
طريقة طويلة
SELECT name, age FROM students
WHERE age >= 19 AND age <= 21;
نفس المثال: مع BETWEEN
طريقة أوضح
SELECT name, age FROM students
WHERE age BETWEEN 19 AND 21;
النتيجة
+-----------+-----+
| name      | age |
+-----------+-----+
| أحمد      | 20  | ✓ (19 ≤ 20 ≤ 21)
| فاطمة     | 19  | ✓ (19 ≤ 19 ≤ 21)
| محمد      | 21  | ✓ (19 ≤ 21 ≤ 21)
| سارة      | 20  | ✓ (19 ≤ 20 ≤ 21)
| نورة      | 19  | ✓ (19 ≤ 19 ≤ 21)
+-----------+-----+
5 rows in set

-- علي (22) لم يظهر لأن 22 > 21

5. أمثلة عملية على BETWEEN

جدول products
+----+------------------+--------+
| id | name             | price  |
+----+------------------+--------+
| 1  | لابتوب Dell      | 3500   |
| 2  | ماوس لاسلكي      | 50     |
| 3  | لوحة مفاتيح      | 120    |
| 4  | شاشة Samsung     | 800    |
| 5  | سماعات           | 150    |
| 6  | كاميرا ويب       | 200    |
+----+------------------+--------+
مثال 1: المنتجات في نطاق سعري
من 100 إلى 500 ريال
SELECT name, price FROM products
WHERE price BETWEEN 100 AND 500;
النتيجة
+------------------+--------+
| name             | price  |
+------------------+--------+
| لوحة مفاتيح      | 120    | ✓
| سماعات           | 150    | ✓
| كاميرا ويب       | 200    | ✓
+------------------+--------+
3 rows in set
مثال 2: BETWEEN مع التواريخ
الطلبات في فترة محددة
SELECT order_id, order_date, total FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';

هذا الاستعلام يُرجع جميع الطلبات في شهر يناير 2024.

6. NOT BETWEEN: خارج النطاق

يمكنك استخدام NOT BETWEEN للبحث عن قيم خارج النطاق المحدد.

مثال: المنتجات خارج النطاق المتوسط
رخيصة جداً أو غالية جداً
SELECT name, price FROM products
WHERE price NOT BETWEEN 100 AND 500;
النتيجة
+------------------+--------+
| name             | price  |
+------------------+--------+
| لابتوب Dell      | 3500   | ✓ (أكبر من 500)
| ماوس لاسلكي      | 50     | ✓ (أقل من 100)
| شاشة Samsung     | 800    | ✓ (أكبر من 500)
+------------------+--------+
3 rows in set

7. دمج IN و BETWEEN مع شروط أخرى

مثال 1: BETWEEN + AND
نطاق عمري + مدينة
SELECT name, age, city FROM students
WHERE age BETWEEN 19 AND 20 AND city = 'الرياض';
النتيجة
+-----------+-----+--------+
| name      | age | city   |
+-----------+-----+--------+
| أحمد      | 20  | الرياض | ✓ (20 في النطاق + الرياض)
+-----------+-----+--------+
1 row in set
مثال 2: IN + BETWEEN
مدن محددة + نطاق عمري
SELECT name, age, city FROM students
WHERE city IN ('الرياض', 'جدة') AND age BETWEEN 19 AND 20;
النتيجة
+-----------+-----+--------+
| name      | age | city   |
+-----------+-----+--------+
| أحمد      | 20  | الرياض | ✓
| فاطمة     | 19  | جدة    | ✓
+-----------+-----+--------+
2 rows in set
مثال 3: استعلام معقد
منتجات في نطاق سعري + فئات محددة
SELECT name, price, category FROM products
WHERE price BETWEEN 100 AND 1000 
  AND category IN ('الكترونيات', 'اكسسوارات');

8. مقارنة: IN vs OR و BETWEEN vs >= AND <=

الميزة OR المتكرر IN
الوضوح 🔴 طويل ومكرر ✅ قصير وواضح
الصيانة 🔴 صعب التعديل ✅ سهل إضافة/حذف قيم
الأداء متشابه متشابه
الميزة >= AND <= BETWEEN
الوضوح واضح ✅ أكثر وضوحاً
القراءة جيد ✅ أسهل في القراءة
الشمولية يشمل الحدود يشمل الحدود

9. نصائح وأفضل الممارسات

1. استخدم IN بدلاً من OR المتكرر
مقارنة
-- سيء: طويل
WHERE status = 'active' OR status = 'pending' OR status = 'review'

-- جيد: قصير
WHERE status IN ('active', 'pending', 'review')
2. BETWEEN شامل للحدود

تذكر أن BETWEEN يشمل القيمتين الحدية:

مثال
-- يشمل 10 و 20
WHERE age BETWEEN 10 AND 20

-- مساوٍ لـ:
WHERE age >= 10 AND age <= 20
3. انتبه لترتيب القيم في BETWEEN
تحذير
-- ✓ صحيح: القيمة الأصغر أولاً
WHERE age BETWEEN 10 AND 20

-- ✗ خطأ: القيمة الأكبر أولاً (لن يُرجع نتائج)
WHERE age BETWEEN 20 AND 10
4. IN مع NULL

IN لا يطابق NULL. استخدم IS NULL للبحث عن قيم NULL.

10. أمثلة عملية متقدمة

مثال 1: تقرير المبيعات الشهري
مبيعات يناير في مدن محددة
SELECT 
    order_id,
    customer_name,
    city,
    total,
    order_date
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31'
  AND city IN ('الرياض', 'جدة', 'مكة')
  AND total BETWEEN 100 AND 5000;
مثال 2: تصنيف الطلاب
طلاب متميزون في مدن رئيسية
SELECT name, age, city, grade FROM students
WHERE grade IN ('A', 'A+')
  AND age BETWEEN 18 AND 22
  AND city IN ('الرياض', 'جدة', 'الدمام');
ملخص الدرس
  • IN: للبحث في قائمة محددة من القيم (بديل أفضل لـ OR المتكرر)
  • NOT IN: لاستبعاد قيم من قائمة
  • BETWEEN: للبحث في نطاق (يشمل الحدود)
  • NOT BETWEEN: للبحث خارج النطاق
  • الدمج: يمكن دمج IN و BETWEEN مع AND و OR
  • Best Practice: استخدم IN و BETWEEN لجعل الكود أوضح وأسهل في الصيانة

الخطوة التالية: التعامل مع القيم الفارغة NULL

أكمل رحلتك التعليمية وانتقل إلى الدرس التالي لتعلم التعامل مع القيم الفارغة NULL وتطوير مهاراتك في قواعد البيانات.

الانتقال إلى الدرس التالي
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن