بسم الله الرحمن الرحيم
عنوان الدرس : الاستعلامات المتقدمة في MySQL - الجزء الأول
بعد أن تعرفت أخي القارئ خلال الدروس السابقة على الاستعلامات و كيفية عملها سننتقل الآن و بعون الله إلى استعلامات أكثر تقدماً, لنبدأ على بركة الله.
تستخدم الاستعلامات المتقدمة مفاهيم خاصة بقواعد البيانات, هذه المفاهيم تدعى بالروابط joins و لهذه الروابط عدة أنواع و هي:
1. الرابطة المشتركة equal join
2. الرابطة الداخلية inner join
3. الرابطة الخارجية outer join
4. الاستعلامات المتداخلة sub-selects
5. الاتحادات unions
6. الربط الذاتي self join
و سنتكلم عنها بشكل مستفيض إن شاء الله.
الرابطة المشتركة equal join :
يُستخدم هذا النوع من الروابط لكتابة استعلامات تطلب نتائج من أكثر من جدول, أي من جدولين على الأقل, معتمدة في ذلك على المفاتيح الغريبة foreign keys للجداول.
ملاحظة:
قلنا سابقاً أن MySQL لا تدعم خاصية المفتاح الغريب بشكل قوي مثل قواعد بيانات Oracle و غيرها , لذلك ستنجح معك الاستعلامات التي ستكتبها بـ MySQL حتى في حال عدم وجود مفاتيح غريبة في الجداول التي تطبق عليها الاستعلام.
لنأخذ هذا المثال أولاً ثم نقوم بتحليله:
اكتب استعلاماً يعيد لنا ما يلي:
اسم الموظف و رقمه و اسم الولاية التي ينتمي إليها.
نحن نعلم أن اسم الموظف و رقمه موجودان في الجدول emp من قاعدة البيانات movie_store و أن الولاية التي ينتمي إليها موجودة في الجدول adrs لذلك عندما نريد أن نكتب هذا الاستعلام فإننا بحاجة إلى ربط الجدولين emp , adrs مع بعضهما البعض, و يتم ذلك عن طريق الرابطة المشتركة كما يلي:
select emp.emp_no , name , state from emp , adrs
where
emp.emp_no = adrs.emp_no ;
الشيء الجديد عليك في هذا الاستعلام هو معامل النقطة, ماذا يعني ؟ و متى نستخدمه ؟
إن معامل النقطة يعني أن العمود المذكور بعده (أي emp_no) ينتمي إلى الجدول المذكور قبله (أي الجدول emp) و بالتالي إذا أردنا أن نقول بأن العمود mov_name الذي ينتمي إلى الجدول movies نكتب movies.mov_name , أما عن استخدامه فإننا نستخدمه في حال كان اسم العمود المطلوب (و هو في مثالنا هذا العمود emp_no) موجود في أكثر من جدول من الجداول الداخلة في الاستعلام, لنفرض أننا كتبنا الاستعلام السابق دون استخدام معامل النقطة كما يلي:
select emp_no , name , state from emp , adrs
عندها سيظهر لنا ملقم MySQL رسالة خطأ و يخبرنا بأنه يوجد هناك عمود اسمه emp_no في كل من الجدولين emp , adrs فأي واحد منهما تقصد ؟
لذلك يجب أن نحدد أن هذا العمود نريده من الجدول الفلاني, و يتم ذلك عن طريق معامل النقطة.
و ستكون نتيجة الاستعلام السابق هي كالتالي:
+----------+---------+------------+
| emp_no | name | state |
+----------+---------+-----------+
| 1 | Omar | Syria |
| 2 | nour | Egypt |
| 4 | ameen | Yemen |
| 3 | ahmad | syria |
+------------+---------+---------+
ملاحظة: يطلق على الرابطة المشتركة أيضاً اسم الرابطة المباشرة straight join
و آخر دعوانا أن الحمد لله رب العالمين
أخوكم أبـو عمر