المعاملات المنطقية في SQL (Logical Operators)
في الدرس السابق، تعلمنا كيفية تصفية البيانات باستخدام شرط واحد مع WHERE. لكن في الواقع، غالباً ما نحتاج إلى دمج عدة شروط معاً. في هذا الدرس الشامل من سلسلة تعلم لغة SQL باللغة العربية، سنتعلم المعاملات المنطقية AND و OR و NOT التي تسمح لنا بإنشاء شروط معقدة ومرنة. ستتعلم كيفية دمج الشروط، فهم أولوية المعاملات، وكتابة استعلامات متقدمة لاستخراج البيانات بدقة.
1. ما هي المعاملات المنطقية في SQL؟
المعاملات المنطقية (Logical Operators) تُستخدم لدمج شرطين أو أكثر في جملة WHERE. هناك ثلاثة معاملات منطقية رئيسية:
| المعامل | الوصف | مثال |
|---|---|---|
AND |
يُرجع TRUE إذا تحقق جميع الشروط | age > 18 AND city = 'الرياض' |
OR |
يُرجع TRUE إذا تحقق أي شرط من الشروط | city = 'جدة' OR city = 'مكة' |
NOT |
يعكس نتيجة الشرط (TRUE → FALSE والعكس) | NOT city = 'الرياض' |
AND كـ "يجب أن يتحقق كل شيء"، و OR كـ "يكفي أن يتحقق شيء واحد"، و NOT كـ "عكس الشرط".
2. معامل AND: يجب تحقق جميع الشروط
معامل AND يُرجع الصفوف التي تحقق جميع الشروط المحددة. إذا فشل أي شرط، لن تُرجع الصف.
SELECT column1, column2
FROM table_name
WHERE condition1 AND condition2;
جدول الحقيقة لـ AND
| الشرط 1 | الشرط 2 | النتيجة (AND) |
|---|---|---|
| TRUE | TRUE | TRUE ✓ |
| TRUE | FALSE | FALSE ✗ |
| FALSE | TRUE | FALSE ✗ |
| FALSE | FALSE | FALSE ✗ |
لنفترض أن لدينا جدول الطلاب:
+----+-----------+-----+--------+--------+
| id | name | age | city | grade |
+----+-----------+-----+--------+--------+
| 1 | أحمد | 20 | الرياض | A |
| 2 | فاطمة | 19 | جدة | B |
| 3 | محمد | 21 | الرياض | A |
| 4 | سارة | 20 | مكة | C |
| 5 | علي | 22 | جدة | B |
| 6 | نورة | 19 | الرياض | A |
+----+-----------+-----+--------+--------+
مثال 1: طلاب من الرياض وعمرهم 20 سنة
SELECT name, age, city FROM students
WHERE city = 'الرياض' AND age = 20;
+-----------+-----+--------+
| name | age | city |
+-----------+-----+--------+
| أحمد | 20 | الرياض | ✓ (الرياض ✓ AND 20 ✓)
+-----------+-----+--------+
1 row in set
-- لماذا لم تظهر نورة؟
-- نورة: الرياض ✓ لكن عمرها 19 ✗ → FALSE
-- محمد: الرياض ✓ لكن عمره 21 ✗ → FALSE
مثال 2: طلاب متفوقون من الرياض
SELECT name, city, grade FROM students
WHERE city = 'الرياض' AND grade = 'A';
+-----------+--------+--------+
| name | city | grade |
+-----------+--------+--------+
| أحمد | الرياض | A | ✓
| محمد | الرياض | A | ✓
| نورة | الرياض | A | ✓
+-----------+--------+--------+
3 rows in set
مثال 3: ثلاثة شروط معاً
SELECT name, age, city, grade FROM students
WHERE city = 'الرياض' AND grade = 'A' AND age >= 20;
+-----------+-----+--------+--------+
| name | age | city | grade |
+-----------+-----+--------+--------+
| أحمد | 20 | الرياض | A | ✓ (الرياض ✓ AND A ✓ AND 20 ✓)
| محمد | 21 | الرياض | A | ✓ (الرياض ✓ AND A ✓ AND 21 ✓)
+-----------+-----+--------+--------+
2 rows in set
-- نورة لم تظهر لأن عمرها 19 (أقل من 20)
3. معامل OR: يكفي تحقق شرط واحد
معامل OR يُرجع الصفوف التي تحقق أي شرط من الشروط المحددة. يكفي أن يتحقق شرط واحد فقط.
جدول الحقيقة لـ OR
| الشرط 1 | الشرط 2 | النتيجة (OR) |
|---|---|---|
| TRUE | TRUE | TRUE ✓ |
| TRUE | FALSE | TRUE ✓ |
| FALSE | TRUE | TRUE ✓ |
| FALSE | FALSE | FALSE ✗ |
مثال 1: طلاب من الرياض أو جدة
SELECT name, city FROM students
WHERE city = 'الرياض' OR city = 'جدة';
+-----------+--------+
| name | city |
+-----------+--------+
| أحمد | الرياض | ✓ (الرياض = TRUE)
| فاطمة | جدة | ✓ (جدة = TRUE)
| محمد | الرياض | ✓ (الرياض = TRUE)
| علي | جدة | ✓ (جدة = TRUE)
| نورة | الرياض | ✓ (الرياض = TRUE)
+-----------+--------+
5 rows in set
-- سارة لم تظهر لأنها من مكة (لا الرياض ولا جدة)
مثال 2: طلاب صغار أو متفوقون
SELECT name, age, grade FROM students
WHERE age < 20 OR grade = 'A';
+-----------+-----+--------+
| name | age | grade |
+-----------+-----+--------+
| أحمد | 20 | A | ✓ (grade = A)
| فاطمة | 19 | B | ✓ (age < 20)
| محمد | 21 | A | ✓ (grade = A)
| نورة | 19 | A | ✓ (age < 20 OR grade = A)
+-----------+-----+--------+
4 rows in set
4. معامل NOT: عكس الشرط
معامل NOT يعكس نتيجة الشرط. إذا كان الشرط TRUE، يصبح FALSE والعكس.
مثال 1: جميع الطلاب ما عدا طلاب الرياض
SELECT name, city FROM students
WHERE NOT city = 'الرياض';
+-----------+--------+
| name | city |
+-----------+--------+
| فاطمة | جدة |
| سارة | مكة |
| علي | جدة |
+-----------+--------+
3 rows in set
ملاحظة: NOT city = 'الرياض' مساوٍ لـ city != 'الرياض'
مثال 2: NOT مع شروط معقدة
SELECT name, age, grade FROM students
WHERE NOT (age < 20 OR grade = 'C');
+-----------+-----+--------+
| name | age | grade |
+-----------+-----+--------+
| أحمد | 20 | A | ✓ (NOT (FALSE OR FALSE) = TRUE)
| محمد | 21 | A | ✓
| علي | 22 | B | ✓
+-----------+-----+--------+
3 rows in set
5. دمج AND و OR: أولوية المعاملات
يمكنك دمج AND و OR في نفس الاستعلام. مهم جداً: AND له أولوية أعلى من OR.
AND قبل OR. استخدم الأقواس () لتوضيح الترتيب المطلوب.
مثال: بدون أقواس (قد يكون مربكاً)
SELECT name, city, grade FROM students
WHERE city = 'الرياض' OR city = 'جدة' AND grade = 'A';
-- كيف يُقرأ هذا؟
-- (city = 'الرياض') OR ((city = 'جدة') AND (grade = 'A'))
-- AND يُقيّم أولاً!
الحل: استخدام الأقواس للوضوح
-- الطريقة 1: طلاب متفوقون من الرياض أو جدة
SELECT name, city, grade FROM students
WHERE (city = 'الرياض' OR city = 'جدة') AND grade = 'A';
-- النتيجة: أحمد، محمد، نورة (من الرياض بدرجة A فقط)
-- فاطمة وعلي لن يظهروا لأن درجتهم B
+-----------+--------+--------+
| name | city | grade |
+-----------+--------+--------+
| أحمد | الرياض | A | ✓
| محمد | الرياض | A | ✓
| نورة | الرياض | A | ✓
+-----------+--------+--------+
3 rows in set
6. أمثلة عملية متقدمة
مثال 1: نظام التجارة الإلكترونية
+----+------------------+--------+-------+----------+
| id | name | price | stock | category |
+----+------------------+--------+-------+----------+
| 1 | لابتوب Dell | 3500 | 15 | الكترونيات |
| 2 | ماوس لاسلكي | 50 | 200 | اكسسوارات |
| 3 | شاشة Samsung | 800 | 25 | الكترونيات |
| 4 | كاميرا Canon | 2500 | 5 | تصوير |
+----+------------------+--------+-------+----------+
SELECT name, price, stock FROM products
WHERE price > 1000 OR stock < 10;
+------------------+--------+-------+
| name | price | stock |
+------------------+--------+-------+
| لابتوب Dell | 3500 | 15 | ✓ (price > 1000)
| كاميرا Canon | 2500 | 5 | ✓ (price > 1000 AND stock < 10)
+------------------+--------+-------+
مثال 2: نظام الموظفين - شروط معقدة
SELECT name, department, salary FROM employees
WHERE (department = 'IT' OR department = 'Sales')
AND salary >= 7000;
مثال 3: استبعاد فئات معينة
SELECT name, category FROM products
WHERE NOT (category = 'الكترونيات' OR category = 'اكسسوارات');
7. نصائح وأفضل الممارسات
1. استخدم الأقواس دائماً عند دمج AND و OR
-- سيء: غامض
WHERE a = 1 OR b = 2 AND c = 3
-- جيد: واضح
WHERE (a = 1 OR b = 2) AND c = 3
-- أو
WHERE a = 1 OR (b = 2 AND c = 3)
2. تذكر أولوية المعاملات
الترتيب من الأعلى إلى الأدنى:
()الأقواسNOTANDOR
3. اختبر الاستعلامات المعقدة خطوة بخطوة
عند كتابة شروط معقدة، اختبر كل جزء على حدة قبل دمجها.
4. استخدم IN بدلاً من OR المتكررة
-- سيء: متكرر
WHERE city = 'الرياض' OR city = 'جدة' OR city = 'مكة'
-- جيد: أقصر وأوضح (سنتعلمها لاحقاً)
WHERE city IN ('الرياض', 'جدة', 'مكة')
ملخص الدرس
- AND: يُرجع TRUE فقط إذا تحقق جميع الشروط
- OR: يُرجع TRUE إذا تحقق أي شرط من الشروط
- NOT: يعكس نتيجة الشرط (TRUE ↔ FALSE)
- الأولوية: () → NOT → AND → OR
- الأقواس: استخدمها دائماً عند دمج AND و OR للوضوح
- Best Practice: اختبر الشروط المعقدة خطوة بخطوة
الخطوة التالية: ترتيب النتائج باستخدام ORDER BY في SQL
أكمل رحلتك التعليمية وانتقل إلى الدرس التالي لتعلم ترتيب النتائج باستخدام ORDER BY في وتطوير مهاراتك في قواعد البيانات.
الانتقال إلى الدرس التالي