بعد أن تعرفت أخي القارئ خلال الدروس السابقة على الاستعلامات وكيفية عملها سننتقل الآن وبعون الله إلى استعلامات أكثر تقدماً, لنبدأ على بركة الله.
تستخدم الاستعلامات المتقدمة مفاهيم خاصة بقواعد البيانات, هذه المفاهيم تدعى بالروابط 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