المحــ البرمجى ــتوى
11-27-2006, 11:44 AM
ستتعرف في الدروس المقبلة إن شاء الله أخي القارئ على تعليمات عديدة من تعليمات لغة DML في MySQL و ستستخدم في جميعها العبارة where لذلك رأيت أن تتعرف على هذه التعليمة قبل أن تغوص في بحر الـ DML حتى تحسن استخدامها هناك, إذا لنبدأ على بركة الله.
العبارة where في MySQL يقصد بها كلمة "حيث", و سأوضح لك معناها و استخدامها من خلال الاستعلام التالي:
select * from movies;
فإن الملقم سيظهر لك كل أعمدة الجدول movies , كل ما تحويه من بيانات, و لكنك لو كتبت الاستعلام التالي:
select * from movies where mov_name='assassins';
فإنه سيعطيك فقط جميع المعلومات عن الفيلم assassins الموجودة في الجدول movies, لاحظ الصيغة القواعدية لهذا الاستعلام ستجد أنه يقسم إلى ثلاث أقسام هم:
القسم الأول هو الاستعلام و هو select * from movies , دعك من هذا الجزء الآن.
القسم الثاني هو الشرط و هو mov_name='assassins' و هذا القسم هو الشرط الذي تضعه أنت كمبرمج على القسم الأول, أي الشرط الذي تضعه على الاستعلام, لاحظ أن هذا الشرط يحوي على معامل مقارنة و هو ( = ) إشارة المساواة, و معامل المقارنة هذا بدوره يربط بين اسم عمود و قيمة فيه حيث أن mov_name هو اسم عمود, و assassins هو قيمة في ذلك العمود, لاحظ أيضا أن القيمة هنا وضعت ضمن علامتي اقتباس, لماذا؟ لأنها قيمة محرفية أو سلسلة محرفية, و لو كانت هذه القيمة قيمة عددية لما وضعناها ضمن علامتي اقتباس كما في الاستعلام التالي:
select * from movies where mov_no=1;
القسم الثالث هو العبارة where حيث تربط هذه العبارة الاستعلام بالشرط.
و أعتقد أن فائدة العبارة where قد أصبحت جلية لك, فالهدف منها هو تحديد عدد الصفوف التي ستتأثر بالاستعلام أو الأمر المكتوب, لفهم هذا الكلام بشكل أفضل قارنه بالاستعلامين السابقين ستتضح لك الصورة بشكل أفضل إن شاء الله.
و الآن عرفت أهمية استخدام where , لنتعلم الآن كيفية استخدامها.
يرتبط استخدام العبارة where بالشرط الموضوع على الاستعلام, و الشرط الموضوع على الاستعلام يتألف من اسم عمود و قيمة في هذا العمود و معامل المقارنة, إليك جدول يضم معاملات المقارنة Comparable Operators :
المعامل المعنى مثال
=
يساوي where col_1 = 5
< أكبر من where col_1 > 5
=< أكبر أو يساوي where col_1 >= 5
> أصغر من where col_1 < 5
=> أصغر أو يساوي where col_1 <= 5
=! لا يساوي where col_1 != 5
is null يحوي null where col_1 in null
is not null لا يحوي null where col_1 is not null
between يشير إلى مجال ما where col_1 between 1 and 5
where col_1 between 'a' and 'b'
هذه هي أهم استخدامات العبارة where و سنأخذ في الدرس القادم إن شاء الله أمثلة تطبيقية عليها حتى يزداد استيعابنا لها,
بعد أن تعرفت على خيارات العبارة Where سنأخذ الآن أمثلة تطبيقية على هذه الخيارات, فلنبدأ على بركة الله.
سيكون الجدول المعتمد لتطبيق خيارات where عليه هو الجدول emp , و لكن قبل أن نطبق الخيارات قم بعمل استعراض لمحتويات الجدول emp حتى تتعرف عليه عن كثب, و قم بكتابة الأمر التالي:
select * from emp;
سيظهر لك الناتج التالي:
+---------------+--------------+---------------+---------------+---------------+--------------+
| emp_no | name | job | salary | bonus |date |
+---------------+--------------+---------------+---------------+---------------+--------------+
| 1 | Omar | manager | 12000.00 | 3000.00 | 20000101 |
| 2 | nour | programmer| 8000.00 | 500.00 | 20000115 |
| 3 | ahmad | seller | 5000.00 | null | 20000201 |
| 4 | ameen | seller | 5000.00 | 0.00 | 20000203 |
+--------------+---------------+---------------+---------------+---------------+---------------+
لاحظ أن عمود الـ date قد يكون معقد بعض الشيء, و ذلك لأنه من التنسيق ذي النوع timestamp, لكن لتفهمه قم بقراءته من اليسار عندها ستلاحظ أن الموظف أمين كان قد انتسب إلى الشركة في تاريخ 03-02-2000 أي في اليوم الثالث من الشهر الثاني من عام 2000 , والآن سنقوم أخي القارئ إن شاء الله بتطبيق المعاملات السابقة على هذا الجدول بالترتيب و سنقوم بشرح الاستعلام الذي يوجب الشرح و المشكلات التي قد تواجهنا أثناء تطبيق الاستعلام حتى تصبح الصورة واضحة تماماً عن العبارة where , و أما الاستعلام البسيط فأعتقد بأنك قادر بعون الله على تحليله لوحدك.
1. معامل المساواة:
select * from emp where emp_no=1 ;
select * from emp where name='omar' ;
لاحظ في الاستعلام الأول أنه في حال استخدام القيم العددية لا داعي لاستخدام علامتي الاقتباس.
لاحظ في الاستعلام الثاني أنه تم استخدام علامتي الاقتباس, و لاحظ أيضا أن MySQL لم يتأثر لحالة الأحرف عندما استخدمنا القيمة omar حيث أن هذه القيمة مخزنة بالشكل التالي Omar .
2. معامل أكبر من:
select * from emp where salary>8000;
3. معامل أكبر أو يساوي:
select * from emp where salary >= 8000;
4. معامل أصغر من:
select * from emp where salary < 8000;
5. معامل أصغر أو يساوي:
select * from emp where salary <= 8000;
6. معامل is null :
select * from emp where bonus in null;
7. معامل is not null :
select * from emp where bonus is not null;
8. معامل between :
select * from emp where salary between 6000 and 15000;
select * from emp where emp_no between 2 and 4;
أما معامل لا يساوي != فقد تركته حتى الدرس المقبل لأطرحه مع قضية أخرى هامة في خيارات العبارة where .
و الآن سنتطرق إلى المعامل لا يساوي (!=), لنبدأ على بركة الله.
9. المعامل لا يساوي:
select * from emp where emp_no != 1 ;
الأمر بسيط جدا أليس كذلك؟ لكن الخطورة ليس هنا بل الخطورة تكون حيث يصطدم هذا المعامل مع الـ null !! كيف ذلك؟ أنا سأخبرك, قم بكتابة الاستعلام التالي:
select * from emp where bonus = 3000;
لاحظ النتيجة, قام MySQL بعرض سجل السيد عمر فقط أليس كذلك؟ و الأمور إلى الآن بخير, حسناً قم بكتابة الاستعلام التالي:
select * from emp where bonus != 3000;
هل لاحظت الخطأ الذي نتج؟ سيقوم MySQL فقط بعرض سجلي الموظفين نور و أمين بينما لم يعرض سجل الموظف أحمد! لماذا؟ لأن قيمة العمود Bonus لديه هو Null لذلك لم يتم عرضه, و للتخلص من هذه المشكلة هناك حلين:
الأول: هو أن تتجنب قدر الإمكان استخدام null في جداولك.
الثاني أن تضيف الجزء التالي or col_name in null إلى كل استعلام تتوقع أن يحتوي على null , و بالعودة إلى الاستعلام السابق سيصبح شكل الاستعلام كما يلي:
select * from emp where bonud != 3000 or in null ;
و عندها سيقوم MySQL بعرض السجلات الثلاث بخير و سلام.
تتيح العبارة where وضع أكثر من شرط على الاستعلام, عن طريق التجميع بين الشروط باستخدام الكلمة المفتاحية and أو or , فإذا كتبنا استعلام وظيفته إظهار معلومات عن الموظفين الذين أرقامهما 1 و 3 فقط نكتب:
select * from emp where emp_no=1 or emp_no=3 ;
لاحظ أخي القارئ أنك يجب ألا تكتب الاستعلام السابق كما يلي:
select * from emp where emp_no=1 and emp_no=3;
فالاستعلام الأول معناه هو (قم يا ملقم MySQL بالاستعلام عن الموظفين الذين أرقامهم 1 أو 3 ), عندها سيقوم الملقم بإظهار المعلومات عن الموظفين ذوي الأرقام 1 أو 3 .
أما الاستعلام الثاني فمعناه هو (قم يا ملقم MySQL بالاستعلام عن الموظفين الذين أرقامهم 1 و 3) و هذا مستحيل لأن كل موظف له رقم واحد فقط و ليس رقمين.
و أظنك أخي القارئ قد أدركت الفرق بين and و or حيث أن الكلمة المفتاحية and تجمع عدة شروط لسجل واحد فقط, بينما الكلمة المفتاحية or تجمع عدة شروط لعدة سجلات.
ستقول لي ما الفائدة من الكلمة and , حسناً الفائدة هي أنها تخولك من جمع أكبر عدد من الشروط لحصر البحث, أي ليظهر لك البحث أقل عدد ممكن من النتائج, و لتوضيح ذلك لاحظ عمليات البحث في محرك بحث و ليكن Google مثلاً , هناك خيار اسمه "بحث متقدم" , و تستطيع عن طريق هذا الخيار أن تكثر من شروط البحث بحيث تحصل على مرادك.
و بذلك نكون قد قدمنا صورة شبه متكاملة عن العبارة where و أتمنى أن تكون قد أصبحت مألوفة لديكم,
العبارة where في MySQL يقصد بها كلمة "حيث", و سأوضح لك معناها و استخدامها من خلال الاستعلام التالي:
select * from movies;
فإن الملقم سيظهر لك كل أعمدة الجدول movies , كل ما تحويه من بيانات, و لكنك لو كتبت الاستعلام التالي:
select * from movies where mov_name='assassins';
فإنه سيعطيك فقط جميع المعلومات عن الفيلم assassins الموجودة في الجدول movies, لاحظ الصيغة القواعدية لهذا الاستعلام ستجد أنه يقسم إلى ثلاث أقسام هم:
القسم الأول هو الاستعلام و هو select * from movies , دعك من هذا الجزء الآن.
القسم الثاني هو الشرط و هو mov_name='assassins' و هذا القسم هو الشرط الذي تضعه أنت كمبرمج على القسم الأول, أي الشرط الذي تضعه على الاستعلام, لاحظ أن هذا الشرط يحوي على معامل مقارنة و هو ( = ) إشارة المساواة, و معامل المقارنة هذا بدوره يربط بين اسم عمود و قيمة فيه حيث أن mov_name هو اسم عمود, و assassins هو قيمة في ذلك العمود, لاحظ أيضا أن القيمة هنا وضعت ضمن علامتي اقتباس, لماذا؟ لأنها قيمة محرفية أو سلسلة محرفية, و لو كانت هذه القيمة قيمة عددية لما وضعناها ضمن علامتي اقتباس كما في الاستعلام التالي:
select * from movies where mov_no=1;
القسم الثالث هو العبارة where حيث تربط هذه العبارة الاستعلام بالشرط.
و أعتقد أن فائدة العبارة where قد أصبحت جلية لك, فالهدف منها هو تحديد عدد الصفوف التي ستتأثر بالاستعلام أو الأمر المكتوب, لفهم هذا الكلام بشكل أفضل قارنه بالاستعلامين السابقين ستتضح لك الصورة بشكل أفضل إن شاء الله.
و الآن عرفت أهمية استخدام where , لنتعلم الآن كيفية استخدامها.
يرتبط استخدام العبارة where بالشرط الموضوع على الاستعلام, و الشرط الموضوع على الاستعلام يتألف من اسم عمود و قيمة في هذا العمود و معامل المقارنة, إليك جدول يضم معاملات المقارنة Comparable Operators :
المعامل المعنى مثال
=
يساوي where col_1 = 5
< أكبر من where col_1 > 5
=< أكبر أو يساوي where col_1 >= 5
> أصغر من where col_1 < 5
=> أصغر أو يساوي where col_1 <= 5
=! لا يساوي where col_1 != 5
is null يحوي null where col_1 in null
is not null لا يحوي null where col_1 is not null
between يشير إلى مجال ما where col_1 between 1 and 5
where col_1 between 'a' and 'b'
هذه هي أهم استخدامات العبارة where و سنأخذ في الدرس القادم إن شاء الله أمثلة تطبيقية عليها حتى يزداد استيعابنا لها,
بعد أن تعرفت على خيارات العبارة Where سنأخذ الآن أمثلة تطبيقية على هذه الخيارات, فلنبدأ على بركة الله.
سيكون الجدول المعتمد لتطبيق خيارات where عليه هو الجدول emp , و لكن قبل أن نطبق الخيارات قم بعمل استعراض لمحتويات الجدول emp حتى تتعرف عليه عن كثب, و قم بكتابة الأمر التالي:
select * from emp;
سيظهر لك الناتج التالي:
+---------------+--------------+---------------+---------------+---------------+--------------+
| emp_no | name | job | salary | bonus |date |
+---------------+--------------+---------------+---------------+---------------+--------------+
| 1 | Omar | manager | 12000.00 | 3000.00 | 20000101 |
| 2 | nour | programmer| 8000.00 | 500.00 | 20000115 |
| 3 | ahmad | seller | 5000.00 | null | 20000201 |
| 4 | ameen | seller | 5000.00 | 0.00 | 20000203 |
+--------------+---------------+---------------+---------------+---------------+---------------+
لاحظ أن عمود الـ date قد يكون معقد بعض الشيء, و ذلك لأنه من التنسيق ذي النوع timestamp, لكن لتفهمه قم بقراءته من اليسار عندها ستلاحظ أن الموظف أمين كان قد انتسب إلى الشركة في تاريخ 03-02-2000 أي في اليوم الثالث من الشهر الثاني من عام 2000 , والآن سنقوم أخي القارئ إن شاء الله بتطبيق المعاملات السابقة على هذا الجدول بالترتيب و سنقوم بشرح الاستعلام الذي يوجب الشرح و المشكلات التي قد تواجهنا أثناء تطبيق الاستعلام حتى تصبح الصورة واضحة تماماً عن العبارة where , و أما الاستعلام البسيط فأعتقد بأنك قادر بعون الله على تحليله لوحدك.
1. معامل المساواة:
select * from emp where emp_no=1 ;
select * from emp where name='omar' ;
لاحظ في الاستعلام الأول أنه في حال استخدام القيم العددية لا داعي لاستخدام علامتي الاقتباس.
لاحظ في الاستعلام الثاني أنه تم استخدام علامتي الاقتباس, و لاحظ أيضا أن MySQL لم يتأثر لحالة الأحرف عندما استخدمنا القيمة omar حيث أن هذه القيمة مخزنة بالشكل التالي Omar .
2. معامل أكبر من:
select * from emp where salary>8000;
3. معامل أكبر أو يساوي:
select * from emp where salary >= 8000;
4. معامل أصغر من:
select * from emp where salary < 8000;
5. معامل أصغر أو يساوي:
select * from emp where salary <= 8000;
6. معامل is null :
select * from emp where bonus in null;
7. معامل is not null :
select * from emp where bonus is not null;
8. معامل between :
select * from emp where salary between 6000 and 15000;
select * from emp where emp_no between 2 and 4;
أما معامل لا يساوي != فقد تركته حتى الدرس المقبل لأطرحه مع قضية أخرى هامة في خيارات العبارة where .
و الآن سنتطرق إلى المعامل لا يساوي (!=), لنبدأ على بركة الله.
9. المعامل لا يساوي:
select * from emp where emp_no != 1 ;
الأمر بسيط جدا أليس كذلك؟ لكن الخطورة ليس هنا بل الخطورة تكون حيث يصطدم هذا المعامل مع الـ null !! كيف ذلك؟ أنا سأخبرك, قم بكتابة الاستعلام التالي:
select * from emp where bonus = 3000;
لاحظ النتيجة, قام MySQL بعرض سجل السيد عمر فقط أليس كذلك؟ و الأمور إلى الآن بخير, حسناً قم بكتابة الاستعلام التالي:
select * from emp where bonus != 3000;
هل لاحظت الخطأ الذي نتج؟ سيقوم MySQL فقط بعرض سجلي الموظفين نور و أمين بينما لم يعرض سجل الموظف أحمد! لماذا؟ لأن قيمة العمود Bonus لديه هو Null لذلك لم يتم عرضه, و للتخلص من هذه المشكلة هناك حلين:
الأول: هو أن تتجنب قدر الإمكان استخدام null في جداولك.
الثاني أن تضيف الجزء التالي or col_name in null إلى كل استعلام تتوقع أن يحتوي على null , و بالعودة إلى الاستعلام السابق سيصبح شكل الاستعلام كما يلي:
select * from emp where bonud != 3000 or in null ;
و عندها سيقوم MySQL بعرض السجلات الثلاث بخير و سلام.
تتيح العبارة where وضع أكثر من شرط على الاستعلام, عن طريق التجميع بين الشروط باستخدام الكلمة المفتاحية and أو or , فإذا كتبنا استعلام وظيفته إظهار معلومات عن الموظفين الذين أرقامهما 1 و 3 فقط نكتب:
select * from emp where emp_no=1 or emp_no=3 ;
لاحظ أخي القارئ أنك يجب ألا تكتب الاستعلام السابق كما يلي:
select * from emp where emp_no=1 and emp_no=3;
فالاستعلام الأول معناه هو (قم يا ملقم MySQL بالاستعلام عن الموظفين الذين أرقامهم 1 أو 3 ), عندها سيقوم الملقم بإظهار المعلومات عن الموظفين ذوي الأرقام 1 أو 3 .
أما الاستعلام الثاني فمعناه هو (قم يا ملقم MySQL بالاستعلام عن الموظفين الذين أرقامهم 1 و 3) و هذا مستحيل لأن كل موظف له رقم واحد فقط و ليس رقمين.
و أظنك أخي القارئ قد أدركت الفرق بين and و or حيث أن الكلمة المفتاحية and تجمع عدة شروط لسجل واحد فقط, بينما الكلمة المفتاحية or تجمع عدة شروط لعدة سجلات.
ستقول لي ما الفائدة من الكلمة and , حسناً الفائدة هي أنها تخولك من جمع أكبر عدد من الشروط لحصر البحث, أي ليظهر لك البحث أقل عدد ممكن من النتائج, و لتوضيح ذلك لاحظ عمليات البحث في محرك بحث و ليكن Google مثلاً , هناك خيار اسمه "بحث متقدم" , و تستطيع عن طريق هذا الخيار أن تكثر من شروط البحث بحيث تحصل على مرادك.
و بذلك نكون قد قدمنا صورة شبه متكاملة عن العبارة where و أتمنى أن تكون قد أصبحت مألوفة لديكم,