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

تصفية البيانات في SQL: WHERE

الدرس 4 من 12 · SQL

نادراً ما تحتاج كل صفوف الجدول. تريد طلاب مدينة معينة، أو المنتجات الأرخص من 100 جنيه، أو الرسائل غير المقروءة. هنا يأتي WHERE: الفلتر الذي يختار الصفوف التي تحقق شرطك فقط. في هذا الدرس ستتعلم كل أدوات التصفية، ومعها فخ شهير مع القيم الفارغة.

سنعمل على نفس جدول الطلاب من الدرس السابق: سارة (القاهرة، 92)، وعمر (الإسكندرية، 78)، ومنى (طنطا، 85)، ويوسف (القاهرة، 64)، وليلى (أسيوط، بلا درجة)، وأحمد (الإسكندرية، 71).

SELECT name, city FROM students WHERE city = 'القاهرة';

الناتج:

name city
سارة القاهرة
يوسف القاهرة

WHERE تأتي بعد FROM، وتمر على كل صف: إذا تحقق الشرط يظهر في النتيجة، وإلا يُستبعد. تخيّلها مثل غربال: البيانات كلها تُصب فيه، وتمر فقط القطع المناسبة.

ولاحظ: المساواة في SQL بعلامة = واحدة، وليست == كما في لغات البرمجة.

العامل المعنى
= يساوي
<> أو != لا يساوي
> و < أكبر من، أصغر من
>= و <= أكبر من أو يساوي، أصغر من أو يساوي
SELECT name, score FROM students WHERE score >= 80;

الناتج:

name score
سارة 92
منى 85

AND: الشرطان معاً.

SELECT name, age, score FROM students WHERE age = 15 AND score > 70;

الناتج:

name age score
عمر 15 78

يوسف عمره 15 أيضاً، لكن درجته 64، فلم يتحقق الشرط الثاني.

OR: يكفي أحدهما.

SELECT name, city FROM students WHERE city = 'طنطا' OR city = 'أسيوط';

الناتج:

name city
منى طنطا
ليلى أسيوط

NOT: عكس الشرط. WHERE NOT city = 'القاهرة' تعرض كل من ليسوا من القاهرة.

بدلاً من OR مكررة:

SELECT name, city FROM students WHERE city IN ('طنطا', 'أسيوط');

النتيجة نفسها تماماً كالمثال السابق، لكن الاستعلام أقصر وأوضح، خاصة مع قوائم طويلة.

SELECT name, score FROM students WHERE score BETWEEN 70 AND 85;

الناتج:

name score
عمر 78
منى 85
أحمد 71

BETWEEN تشمل الطرفين: منى درجتها 85 بالضبط وظهرت.

للبحث عن نمط داخل النص، مع رموز خاصة:

  • %: أي عدد من الحروف (حتى صفر).
  • _: حرف واحد بالضبط.
SELECT name FROM students WHERE name LIKE 'م%';

الناتج: منى (الاسم يبدأ بحرف الميم).

SELECT name FROM students WHERE name LIKE '%ى';

الناتج:

name
منى
ليلى

(الأسماء التي تنتهي بالألف المقصورة.) ونمط مثل '%علي%' يبحث عن «علي» في أي مكان من النص، وهكذا تعمل خانات البحث في كثير من المواقع.

من الطلاب الذين لم تُسجَّل درجاتهم؟ قد تكتب:

SELECT name FROM students WHERE score = NULL;

الناتج: لا شيء! جدول فارغ.

لماذا؟ لأن NULL تعني «قيمة مجهولة»، ومقارنة أي شيء بالمجهول نتيجتها مجهولة أيضاً، وليست «صحيحة». السؤال «هل درجة ليلى تساوي المجهول؟» لا إجابة له. الطريقة الصحيحة:

SELECT name FROM students WHERE score IS NULL;

الناتج: ليلى.

و IS NOT NULL للعكس: الطلاب الذين لديهم درجة.

تخيّل NULL مثل ظرف مغلق لا تعرف ما بداخله. لا تستطيع أن تقول إنه يساوي ظرفاً مغلقاً آخر، لكنك تستطيع أن تقول «هذا ظرف مغلق».

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

  1. الطلاب الذين أعمارهم 13 سنة.
  2. الطلاب من الإسكندرية الذين درجاتهم أكبر من 75.
  3. الطلاب الذين أعمارهم 13 أو 14 باستخدام IN.
  4. الطلاب الذين تحتوي أسماؤهم على حرف الميم في أي مكان.
  5. الطلاب الذين لديهم درجة مسجلة.
  • = NULL بدل IS NULL: نتيجة فارغة دائماً بلا أي رسالة خطأ.
  • نسيان علامات التنصيص حول النص: WHERE city = القاهرة خطأ. النصوص بين علامتين مفردتين.
  • خلط AND و OR بلا أقواس: نتائج غير متوقعة. استخدم الأقواس للوضوح.

سؤال

أي شرط يجلب الطلاب الذين لم تُسجَّل درجاتهم؟

سؤال

هل تشمل BETWEEN 10 AND 20 القيمتين 10 و 20؟

  • WHERE تصفّي الصفوف حسب شرط، وتأتي بعد FROM، والمساواة بـ = واحدة.
  • AND و OR و NOT لدمج الشروط، والأقواس للوضوح.
  • IN لقائمة قيم، و BETWEEN لمدى شامل الطرفين.
  • LIKE مع % و _ للبحث في النصوص.
  • IS NULL و IS NOT NULL للقيم الفارغة، و = NULL لا تعمل أبداً.