MySQL: التصفية المتقدمة واستعلامات التعبيرات العادية في MySQL
آخر تحديث: 2026-08-26
عندما لا يكفي التصفية الأساسية، تتيح لك التصفية المتقدمة تحديد بيانات معينة بدقة.
يقدم هذا الدرس شرحًا متعمقًا للتراكيب الشرطية المعقدة والتعبيرات النمطية.
graph TB
A[WHERE Combinations of Conditions] --> B[AND Logic and]
A --> C[OR Logical OR]
A --> D[NOT Negate]
B --> E[All conditions are met simultaneously]
C --> F[Meets any one of the conditions]
A --> G[IN List Matching]
A --> H[BETWEEN Scope]
A --> I[LIKE Wildcard]
A --> J[REGEXP Regular]
A --> K[EXISTS Subquery]
1. ما ستتعلمه
- تركيبات الشروط «و»/«أو»
- استعلام قائمة «موجود/غير موجود»
- استعلام النطاق «BETWEEN»
- مطابقة أحرف البدل LIKE
- REGEXP: التعبيرات النمطية
2. قصة حقيقية عن ميزة البحث
(1) المشكلة: نتائج بحث غير دقيقة
يبحث أحد المستخدمين عن كلمة «جون» ويطلب نتائج مطابقة لـ:
- جون سميث
- جونسون
- john@example.com آه، جون
لا يمكن لـ LIKE '%john%' البسيط أن يتطابق إلا مع سيناريو واحد.
(2) الحل باستخدام REGEXP
SQL
SELECT * FROM users
WHERE first_name REGEXP '^john|john$|john'
OR email REGEXP 'john';
3. «و/أو» — تحليل متعمق
▶ مثال: تركيبات معقدة من الشروط
SQL
-- Search: Engineering or Sales department, and salary > 5000
SELECT * FROM employees
WHERE (department = 'Engineering' OR department = 'Sales')
AND salary > 5000;
-- Search: Salary 5000-8000, not HR department
SELECT * FROM employees
WHERE salary BETWEEN 5000 AND 8000
AND department != 'HR';
-- Search: Hired after 2024, or salary > 10000
SELECT * FROM employees
WHERE hire_date >= '2024-01-01' OR salary > 10000;
4. موجود/غير موجود
▶ مثال: استعلام قائمة
SQL
-- IN Search
SELECT * FROM products WHERE category_id IN (1, 3, 5, 7);
-- NOT IN Search
SELECT * FROM products WHERE category_id NOT IN (2, 4, 6);
-- Subquery IN
SELECT * FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'Beijing');
-- NOT EXISTS replacement for NOT IN (Better performance)
SELECT * FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.id
);
5. الاستخدام المتقدم لعلامة BETWEEN
▶ مثال: استعلام النطاق
SQL
-- Value Range
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
-- Date Range
SELECT * FROM orders WHERE order_date BETWEEN '2026-01-01' AND '2026-06-30';
-- String Range
SELECT * FROM employees WHERE last_name BETWEEN 'A' AND 'M';
-- NOT BETWEEN
SELECT * FROM products WHERE price NOT BETWEEN 100 AND 500;
6. حرف البدل «LIKE»
▶ مثال: المطابقة التقريبية
SQL
-- % Match any number of characters (including 0)
SELECT * FROM users WHERE name LIKE 'J%'; -- Starts with J
SELECT * FROM users WHERE name LIKE '%son'; -- Ends with son
SELECT * FROM users WHERE name LIKE '%john%'; -- Contains john
-- _ Matches exactly one character
SELECT * FROM users WHERE name LIKE 'J_hn'; -- J_hn (John, Johan)
-- Used in combination
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- ESCAPE escaping special characters
SELECT * FROM files WHERE name LIKE '%\_%' ESCAPE '\\'; -- Contains _
SELECT * FROM files WHERE name LIKE '%%' ESCAPE '\\'; -- Contains %
7. REGEXP: التعبيرات النمطية
(1) الأحرف الخاصة الشائعة في التعبيرات النمطية
| الحرف الخاص | الوصف | مثال |
|---|---|---|
^ |
البداية | '^John' — يبدأ بـ جون |
$ |
النهاية | 'son$' — تنتهي بكلمة «ابن» |
. |
أي حرف واحد | 'J.hn' — جون، يوهان |
[...] |
مجموعة الأحرف | '[abc]' — أحد الخيارات a/b/c |
[^...] |
استبعاد مجموعة الأحرف | [^abc] — ليس a/b/c |
* |
0 مرة أو أكثر | 'ab*' — a، ab، abb |
+ |
مرة واحدة أو أكثر | 'ab+' — a، ab |
? |
0 مرة أو 1 مرة | 'ab?' — a، ab |
{n} |
n مرة بالضبط | 'a{3}' — aaa |
{n,m} |
n إلى m مرات | 'a{2,4}' — aa~aaaa |
| |
أو | 'cat|dog' — قطة أو كلب |
▶ مثال: استعلام REGEXP
SQL
-- Starts with J or j
SELECT * FROM users WHERE first_name REGEXP '^[Jj]';
-- Contains numbers
SELECT * FROM users WHERE username REGEXP '[0-9]';
-- Email format validation (Simple)
SELECT * FROM users WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';
-- Mobile phone number format (Mainland China)
SELECT * FROM users WHERE phone REGEXP '^1[3-9][0-9]{9}$';
-- Contains CJK characters
SELECT * FROM users WHERE name REGEXP '[\\u4e00-\\u9fff]';
▶ مثال: REGEXP مقابل LIKE
SQL
-- LIKE matches must be at the beginning and end only
SELECT * FROM users WHERE name LIKE '%john%'; -- Contains john
-- REGEXP allows for precise control
SELECT * FROM users WHERE name REGEXP '^john$'; -- Exactly equal to john (Case-insensitive)
SELECT * FROM users WHERE name REGEXP 'john|jane'; -- john or jane
SELECT * FROM users WHERE name REGEXP '^[A-Z]'; -- Starts with a capital letter
8. الاستعلامات الفرعية لـ EXISTS
▶ مثال: استخدام EXISTS
SQL
-- Query Customers with Orders
SELECT * FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
-- Query Customers with No Orders
SELECT * FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
❓ أسئلة شائعة
س هل يمكن لاستعلام
LIKE '%keyword%' استخدام فهرس؟ج إذا احتوى البادئة على
%، فلا يمكنه استخدام فهرس وسيُجرى مسحًا كاملاً للجدول. بالنسبة لمجموعات البيانات الكبيرة، يُنصح باستخدام فهرس النص الكامل (FULLTEXT).س أيهما أسرع، REGEXP أم LIKE؟
ج عادةً ما تكون LIKE أسرع (حيث يمكنها استخدام الفهارس). أما REGEXP فهي أكثر مرونة، لكنها لا تستطيع استخدام الفهارس (مدعومة جزئيًا في MySQL 8.0).
س أيهما أفضل أداءً، IN أم OR؟
ج يكون أداءهما متشابهاً عندما تكون البيانات قليلة. وعندما تكون قائمة IN طويلة، تقوم MySQL بتحسينها لتحويلها إلى بحث ثنائي مرتب، وهو أسرع من OR.
س هل هناك فخ NULL عند استخدام NOT IN؟
ج نعم.
NOT IN (1, 2, NULL) تُرجع دائمًا NULL لأن المقارنة التي تتضمن NULL تؤدي إلى NULL. استخدم NOT EXISTS بدلاً من ذلك.📖 ملخص
- و/أو: شروط مجمعة؛ استخدم الأقواس لتحديد ترتيب العمليات
- استعلامات قائمة موجود/غير موجود: احذر من «مصائد» القيم الفارغة (NULL)
- استعلام النطاق BETWEEN، بما في ذلك كلا الطرفين
- LIKE حرف البدل:
%أي عدد من الأحرف،_حرف واحد - REGEXP التعبيرات النمطية؛ تدعم مطابقة الأنماط المعقدة
- EXISTS: فحص وجود الاستعلام الفرعي؛ ويكون الأداء عمومًا أفضل من IN
📝 تمارين
-
سؤال أساسي (مستوى الصعوبة: ⭐): استخدم استعلام LIKE للعثور على المستخدمين الذين تحتوي عناوين بريدهم الإلكتروني على "@gmail.com" وتبدأ أسماء المستخدمين الخاصة بهم بحرف "J".
-
مشكلة متقدمة (درجة الصعوبة ⭐⭐): استخدم REGEXP لمطابقة أرقام الهواتف المحمولة في الصين القارية (التي تبدأ بالرقم 1، ويكون الرقم الثاني من 3 إلى 9، ويبلغ مجموع أرقامها 11 رقمًا).
-
سؤال التحدي (مستوى الصعوبة: ⭐⭐⭐): قارن الاختلافات في نتائج الاستعلام بين
NOT INوNOT EXISTSعند وجود قيم NULL.