البحث بالأنماط باستخدام LIKE في SQL
في الدروس السابقة، استخدمنا معامل المساواة = للبحث عن قيم محددة بدقة. لكن ماذا لو أردت البحث عن أسماء تبدأ بحرف معين، أو تحتوي على كلمة معينة؟ هنا يأتي دور LIKE! في هذا الدرس الشامل من سلسلة تعلم لغة SQL باللغة العربية، سنتعلم كيفية استخدام LIKE للبحث بالأنماط (Pattern Matching)، استخدام الرموز البديلة (Wildcards)، والبحث المرن في النصوص.
1. ما هو LIKE في SQL؟
LIKE هو معامل يُستخدم في جملة WHERE للبحث عن نمط معين في عمود نصي. على عكس = الذي يبحث عن مطابقة تامة، LIKE يسمح بالبحث الجزئي والمرن.
SELECT column1, column2
FROM table_name
WHERE column_name LIKE pattern;
LIKE كمحرك بحث Google - يمكنك البحث عن جزء من الكلمة وسيجد لك جميع النتائج المطابقة.
2. الرموز البديلة (Wildcards) في SQL
لاستخدام LIKE بفعالية، نحتاج إلى فهم الرموز البديلة (Wildcards):
| الرمز | الوصف | مثال | يطابق |
|---|---|---|---|
% |
يمثل صفر أو أكثر من الأحرف | 'أ%' |
أحمد، أمير، أسامة، أ |
_ |
يمثل حرف واحد فقط | 'س_رة' |
سارة، سيرة، سورة |
% يمثل أي عدد من الأحرف (حتى صفر)، بينما _ يمثل حرف واحد بالضبط.
3. استخدام % للبحث المرن
لنفترض أن لدينا جدول الطلاب:
+----+------------------+----------------------+
| id | name | email |
+----+------------------+----------------------+
| 1 | أحمد محمد | ahmed@gmail.com |
| 2 | محمد علي | mohammed@yahoo.com |
| 3 | فاطمة أحمد | fatima@gmail.com |
| 4 | سارة حسن | sara@outlook.com |
| 5 | علي أحمد | ali@gmail.com |
| 6 | نورة محمد | noura@hotmail.com |
+----+------------------+----------------------+
مثال 1: الأسماء التي تبدأ بـ "أحمد"
SELECT name FROM students
WHERE name LIKE 'أحمد%';
+------------------+
| name |
+------------------+
| أحمد محمد | ✓ يبدأ بـ "أحمد"
+------------------+
1 row in set
مثال 2: الأسماء التي تنتهي بـ "محمد"
SELECT name FROM students
WHERE name LIKE '%محمد';
+------------------+
| name |
+------------------+
| أحمد محمد | ✓ ينتهي بـ "محمد"
| نورة محمد | ✓ ينتهي بـ "محمد"
+------------------+
2 rows in set
مثال 3: الأسماء التي تحتوي على "أحمد" في أي مكان
SELECT name FROM students
WHERE name LIKE '%أحمد%';
+------------------+
| name |
+------------------+
| أحمد محمد | ✓ يحتوي على "أحمد"
| فاطمة أحمد | ✓ يحتوي على "أحمد"
| علي أحمد | ✓ يحتوي على "أحمد"
+------------------+
3 rows in set
مثال 4: البريد الإلكتروني من Gmail
SELECT name, email FROM students
WHERE email LIKE '%@gmail.com';
+------------------+----------------------+
| name | email |
+------------------+----------------------+
| أحمد محمد | ahmed@gmail.com | ✓
| فاطمة أحمد | fatima@gmail.com | ✓
| علي أحمد | ali@gmail.com | ✓
+------------------+----------------------+
3 rows in set
4. استخدام _ للبحث الدقيق
الرمز _ يمثل حرف واحد بالضبط.
+----+------------------+
| id | code |
+----+------------------+
| 1 | A101 |
| 2 | A102 |
| 3 | A201 |
| 4 | B101 |
| 5 | A1001 |
+----+------------------+
مثال 1: الأكواد التي تبدأ بـ A ثم رقم واحد ثم 01
SELECT code FROM products
WHERE code LIKE 'A_01';
+------------------+
| code |
+------------------+
| A101 | ✓ (A + 1 + 01)
| A201 | ✓ (A + 2 + 01)
+------------------+
2 rows in set
-- لماذا لم يظهر A1001؟
-- لأن _ يمثل حرف واحد فقط، وA1001 يحتوي على 4 أحرف بعد A
مثال 2: دمج % و _
SELECT code FROM products
WHERE code LIKE 'A_0%';
+------------------+
| code |
+------------------+
| A101 | ✓ (A + 1 + 0 + ...)
| A102 | ✓ (A + 1 + 0 + ...)
| A201 | ✓ (A + 2 + 0 + ...)
| A1001 | ✓ (A + 1 + 0 + ...)
+------------------+
4 rows in set
5. NOT LIKE: البحث العكسي
يمكنك استخدام NOT LIKE لاستبعاد الأنماط المطابقة.
مثال: جميع الطلاب ما عدا Gmail
SELECT name, email FROM students
WHERE email NOT LIKE '%@gmail.com';
+------------------+----------------------+
| name | email |
+------------------+----------------------+
| محمد علي | mohammed@yahoo.com | ✓
| سارة حسن | sara@outlook.com | ✓
| نورة محمد | noura@hotmail.com | ✓
+------------------+----------------------+
3 rows in set
6. أمثلة عملية متقدمة
مثال 1: البحث عن أرقام هواتف بنمط معين
SELECT name, phone FROM customers
WHERE phone LIKE '05%';
مثال 2: البحث في أسماء المنتجات
SELECT name, price FROM products
WHERE name LIKE '%لابتوب%';
مثال 3: دمج LIKE مع AND
SELECT name, email FROM students
WHERE name LIKE 'أ%' AND email LIKE '%@gmail.com';
مثال 4: دمج LIKE مع OR
SELECT name, email FROM students
WHERE email LIKE '%@gmail.com' OR email LIKE '%@yahoo.com';
7. الفرق بين LIKE و =
| الميزة | = |
LIKE |
|---|---|---|
| نوع المطابقة | مطابقة تامة (Exact match) | مطابقة نمط (Pattern match) |
| استخدام Wildcards | ❌ لا يدعم | ✅ يدعم (%, _) |
| السرعة | ⚡ أسرع | 🐢 أبطأ قليلاً |
| الاستخدام | قيم محددة بدقة | بحث مرن في النصوص |
-- = : مطابقة تامة فقط
WHERE name = 'أحمد'
-- سيجد فقط "أحمد" بالضبط
-- LIKE : مطابقة نمط
WHERE name LIKE '%أحمد%'
-- سيجد: "أحمد"، "أحمد محمد"، "محمد أحمد"، "فاطمة أحمد"
8. نصائح وأفضل الممارسات
1. استخدم = بدلاً من LIKE عندما تعرف القيمة الدقيقة
-- سيء: بطيء
WHERE email LIKE 'ahmed@gmail.com'
-- جيد: أسرع
WHERE email = 'ahmed@gmail.com'
2. انتبه لحساسية حالة الأحرف (Case Sensitivity)
في معظم أنظمة SQL (MySQL، SQL Server)، LIKE غير حساس لحالة الأحرف بشكل افتراضي:
-- هذه الثلاثة متساوية في MySQL
WHERE name LIKE 'ahmed%'
WHERE name LIKE 'Ahmed%'
WHERE name LIKE 'AHMED%'
3. استخدم الفهارس (Indexes) بحذر
LIKE 'text%' يمكن أن يستخدم الفهرس، لكن LIKE '%text' أو LIKE '%text%' لا يمكنهما استخدام الفهرس وقد يكونان بطيئين على الجداول الكبيرة.
4. تجنب البحث الزائد
-- سيء: بحث واسع جداً
WHERE name LIKE '%%' -- سيرجع كل شيء!
-- جيد: محدد
WHERE name LIKE 'أ%'
9. أنماط LIKE الشائعة
| النمط | الوصف | مثال |
|---|---|---|
'A%' |
يبدأ بـ A | Ahmed, Ali, Amira |
'%a' |
ينتهي بـ a | Sara, Fatima, Noura |
'%test%' |
يحتوي على test | test, testing, latest |
'_a%' |
الحرف الثاني هو a | Sara, Hala, Rana |
'A___' |
يبدأ بـ A وطوله 4 أحرف | A101, A202, A999 |
ملخص الدرس
- LIKE: للبحث بالأنماط في النصوص
- %: يمثل صفر أو أكثر من الأحرف
- _: يمثل حرف واحد بالضبط
- NOT LIKE: لاستبعاد الأنماط
- الأداء: = أسرع من LIKE عند معرفة القيمة الدقيقة
- Best Practice: استخدم LIKE فقط عند الحاجة للبحث المرن
الخطوة التالية: معاملات IN و BETWEEN في SQL
أكمل رحلتك التعليمية وانتقل إلى الدرس التالي لتعلم معاملات IN و BETWEEN في وتطوير مهاراتك في قواعد البيانات.
الانتقال إلى الدرس التالي