معاملات 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 (طريقة طويلة)
SELECT name, city FROM students
WHERE city = 'الرياض' OR city = 'جدة' OR city = 'مكة';
نفس المثال: مع IN (طريقة أفضل)
SELECT name, city FROM students
WHERE city IN ('الرياض', 'جدة', 'مكة');
2. أمثلة عملية على IN
لنفترض أن لدينا جدول الطلاب:
+----+-----------+-----+--------+--------+
| 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: البحث عن درجات محددة
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
+----+------------------+--------+
| id | name | price |
+----+------------------+--------+
| 1 | لابتوب Dell | 3500 |
| 2 | ماوس لاسلكي | 50 |
| 3 | لوحة مفاتيح | 120 |
| 4 | شاشة Samsung | 800 |
| 5 | سماعات | 150 |
| 6 | كاميرا ويب | 200 |
+----+------------------+--------+
مثال 1: المنتجات في نطاق سعري
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 وتطوير مهاراتك في قواعد البيانات.
الانتقال إلى الدرس التالي