تخطَّ إلى المحتوى

التصفية في MySQL: WHERE مع التواريخ والنصوص

الدرس 4 من 12 · MySQL

زائر متجرك لا يريد رؤية كل المنتجات: يريد الإلكترونيات فقط، أو المنتجات الأرخص من 200 جنيه، أو ما وصل حديثاً. كل فلتر في صفحة المتجر يتحول في الخلفية إلى شرط WHERE. في هذا الدرس ستكتب هذه الفلاتر، مع تفاصيل خاصة بـ MySQL في التعامل مع التواريخ والنصوص.

سنعمل على جدول المنتجات من الدرس السابق.

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)، فلم تظهر. هكذا يعمل فلتر «المتوفر فقط» في المتاجر.

التواريخ في 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 يوماً.

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'.

خانة البحث في المتجر:

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 added
FROM products WHERE id >= 5;

الناتج:

name added
قصص الأطفال 2026-10-20
مجموعة أقلام غير معروف
مسطرة غير معروف

IFNULL(قيمة, بديل): إذا كانت القيمة NULL أعطني البديل. ويوجد أيضاً COALESCE القياسية التي تقبل عدة بدائل.

اكتب استعلامات تعرض:

  1. منتجات التصنيف «كتب» التي سعرها أقل من 100.
  2. المنتجات التي نفدت من المخزن (stock = 0).
  3. المنتجات المضافة في شهر سبتمبر 2026 باستخدام BETWEEN.
  4. المنتجات التي يحتوي اسمها على كلمة «علمية» أو «مدرسية».
  5. كل المنتجات مع تاريخ الإضافة، أو كلمة «جديد» إذا كان فارغاً.
  • صيغة تاريخ خاطئة: '1/10/2026' قد تعطي نتائج خاطئة أو تحذيراً. استخدم '2026-10-01'.
  • = NULL بدل IS NULL: نتيجة فارغة دائماً بلا رسالة خطأ.
  • البحث بـ LIKE على جداول ضخمة: '%كلمة%' يفحص كل الصفوف وقد يكون بطيئاً مع ملايين المنتجات. المتاجر الكبيرة تستخدم أدوات بحث متخصصة مثل الفهرسة النصية (FULLTEXT).

سؤال

ما الصيغة الموصى بها لكتابة تاريخ أول أكتوبر 2026 في MySQL؟

سؤال

ماذا تُرجع IFNULL(NULL, 'لا يوجد')؟

  • WHERE مع AND و OR لبناء فلاتر المتجر مثل «المتوفر وأرخص من 100».
  • التواريخ بصيغة 'YYYY-MM-DD' وتُقارن مثل الأرقام، ومعها دوال التاريخ.
  • BETWEEN لنطاق الأسعار والتواريخ شاملاً الطرفين، و LIKE للبحث.
  • الترتيب _ci لا يفرق بين الأحرف الكبيرة والصغيرة، و COLLATE utf8mb4_bin للمقارنة الدقيقة.
  • IS NULL للفحص، و IFNULL لعرض قيمة بديلة.