التصفية في MySQL: WHERE مع التواريخ والنصوص
زائر متجرك لا يريد رؤية كل المنتجات: يريد الإلكترونيات فقط، أو المنتجات الأرخص من 200 جنيه، أو ما وصل حديثاً. كل فلتر في صفحة المتجر يتحول في الخلفية إلى شرط WHERE. في هذا الدرس ستكتب هذه الفلاتر، مع تفاصيل خاصة بـ MySQL في التعامل مع التواريخ والنصوص.
سنعمل على جدول المنتجات من الدرس السابق.
الشرط الأساسي
Section titled “الشرط الأساسي”SELECT name, price FROM products WHERE category = 'إلكترونيات';الناتج:
| name | price |
|---|---|
| سماعة لاسلكية | 450.50 |
| آلة حاسبة علمية | 199.99 |
ودمج الشروط بـ AND: منتجات متوفرة في المخزن وسعرها أقل من 100:
SELECT name, stock FROM products WHERE stock > 0 AND price < 100;الناتج:
| name | stock |
|---|---|
| قصص الأطفال | 30 |
| مجموعة أقلام | 50 |
المسطرة سعرها 10 لكنها نفدت (stock يساوي 0)، فلم تظهر. هكذا يعمل فلتر «المتوفر فقط» في المتاجر.
التصفية بالتاريخ
Section titled “التصفية بالتاريخ”التواريخ في MySQL تُكتب كنص بالصيغة 'YYYY-MM-DD'، وتُقارن مثل الأرقام:
SELECT name, added_on FROM products WHERE added_on >= '2026-10-01';الناتج:
| name | added_on |
|---|---|
| حقيبة مدرسية | 2026-10-02 |
| آلة حاسبة علمية | 2026-10-10 |
| قصص الأطفال | 2026-10-20 |
هذا هو قسم «وصل حديثاً» في أي متجر. ويمكنك استخدام دوال التاريخ من الدرس السابق: WHERE YEAR(added_on) = 2026 أو WHERE added_on >= CURDATE() - INTERVAL 30 DAY لآخر 30 يوماً.
BETWEEN للأسعار
Section titled “BETWEEN للأسعار”SELECT name, price FROM products WHERE price BETWEEN 50 AND 200;الناتج:
| name | price |
|---|---|
| كتاب البرمجة للمبتدئين | 120.00 |
| آلة حاسبة علمية | 199.99 |
| قصص الأطفال | 65.00 |
BETWEEN تشمل الطرفين، وهي الطريقة المعتادة لفلتر «نطاق السعر» في المتاجر. وتعمل مع التواريخ أيضاً: added_on BETWEEN '2026-10-01' AND '2026-10-31'.
البحث: LIKE
Section titled “البحث: LIKE”خانة البحث في المتجر:
SELECT name FROM products WHERE name LIKE '%كتاب%' OR name LIKE '%قصص%';الناتج:
| name |
|---|
| كتاب البرمجة للمبتدئين |
| قصص الأطفال |
% تعني «أي عدد من الحروف»، فـ '%كتاب%' تعني «كلمة كتاب في أي مكان».
الأحرف الكبيرة والصغيرة
Section titled “الأحرف الكبيرة والصغيرة”جرّب هذا:
SELECT 'MySQL' = 'mysql' AS same;الناتج: 1 (أي صحيح)
لأن ترتيب المقارنة utf8mb4_unicode_ci الذي اخترناه عند إنشاء القاعدة لا يفرّق بين الأحرف الكبيرة والصغيرة. هذا مريح جداً في البحث: من يكتب «iphone» سيجد «iPhone». أما إذا احتجت مقارنة دقيقة حرفاً بحرف، كأكواد الخصم، فاستخدم ترتيب مقارنة ثنائياً: WHERE code = 'SAVE10' COLLATE utf8mb4_bin. (ستجد في أمثلة قديمة الصيغة BINARY code، لكنها مهجورة في الإصدارات الحديثة وتعطي تحذيراً.)
القيم الفارغة: IS NULL و IFNULL
Section titled “القيم الفارغة: IS NULL و IFNULL”المنتجات التي لم يُسجَّل تاريخ إضافتها:
SELECT name FROM products WHERE added_on IS NULL;الناتج:
| name |
|---|
| مجموعة أقلام |
| مسطرة |
وتذكّر: = NULL لا تعمل أبداً، لأن NULL قيمة مجهولة لا تساوي شيئاً.
ولعرض قيمة بديلة مكان NULL في النتيجة، تستخدم MySQL الدالة IFNULL:
SELECT name, IFNULL(added_on, 'غير معروف') AS addedFROM products WHERE id >= 5;الناتج:
| name | added |
|---|---|
| قصص الأطفال | 2026-10-20 |
| مجموعة أقلام | غير معروف |
| مسطرة | غير معروف |
IFNULL(قيمة, بديل): إذا كانت القيمة NULL أعطني البديل. ويوجد أيضاً COALESCE القياسية التي تقبل عدة بدائل.
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب استعلامات تعرض:
- منتجات التصنيف «كتب» التي سعرها أقل من 100.
- المنتجات التي نفدت من المخزن (
stock = 0). - المنتجات المضافة في شهر سبتمبر 2026 باستخدام
BETWEEN. - المنتجات التي يحتوي اسمها على كلمة «علمية» أو «مدرسية».
- كل المنتجات مع تاريخ الإضافة، أو كلمة «جديد» إذا كان فارغاً.
أخطاء شائعة
Section titled “أخطاء شائعة”- صيغة تاريخ خاطئة:
'1/10/2026'قد تعطي نتائج خاطئة أو تحذيراً. استخدم'2026-10-01'. - = NULL بدل IS NULL: نتيجة فارغة دائماً بلا رسالة خطأ.
- البحث بـ LIKE على جداول ضخمة:
'%كلمة%'يفحص كل الصفوف وقد يكون بطيئاً مع ملايين المنتجات. المتاجر الكبيرة تستخدم أدوات بحث متخصصة مثل الفهرسة النصية (FULLTEXT).
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما الصيغة الموصى بها لكتابة تاريخ أول أكتوبر 2026 في MySQL؟
الصيغة القياسية سنة-شهر-يوم لا تحتمل اللبس، وهي الصيغة التي تفهمها MySQL مباشرة.
سؤال
ماذا تُرجع IFNULL(NULL, 'لا يوجد')؟
IFNULL تُرجع القيمة البديلة عندما تكون القيمة الأولى NULL.
الخلاصة
Section titled “الخلاصة”WHEREمعANDوORلبناء فلاتر المتجر مثل «المتوفر وأرخص من 100».- التواريخ بصيغة
'YYYY-MM-DD'وتُقارن مثل الأرقام، ومعها دوال التاريخ. BETWEENلنطاق الأسعار والتواريخ شاملاً الطرفين، وLIKEللبحث.- الترتيب
_ciلا يفرق بين الأحرف الكبيرة والصغيرة، وCOLLATE utf8mb4_binللمقارنة الدقيقة. IS NULLللفحص، وIFNULLلعرض قيمة بديلة.