اخذنا في الدرس السابق دوال التحويل اليوم ان شاء
الله سندخل في قسم جديد ضمن دروسنا شرح sql بالعربي وهو موضوع الاستعلامات الفرعية .
الاستعلام الفرعي هو أي استعلام يتم تضمينه في
إستعلام آخر .
ملاحظات :
- يمكن للاستعلام الفرعي ان يحتوي استعلاما فرعيا اخر.
- ليس من الضروري ان تستخدم الاستعلامات الفرعية نفس الجداول التي تستخدمها الاستعلامات الرئيسة .
- لا تدعم قواعد بيانات MySQL الاستعلامات الفرعية بل تستخدم بدلا منها ما يسمى Join التي سنأتي على ذكرها لاحقاً .
تابع معي الان الاستعلامات الفرعية :
اولاً الاستعلامات الفرعية المرتبطة باستعلام رئيسي :
هي
الاستعلامات الفرعية التي
تعتمد في عملها
على بيانات من استعلامات رئيسية حاوية
لها.
في
هذا النوع من
الاستعلامات الفرعية، يتم
تكرار عملية تنفيذ
الاستعلام بعدد مرات
مساوٍ لعدد السجلات التي يُعيدها
الاستعلام الرئيسي.
مثال:
إذا
كان لدينا الجدول Customers الحاوي
على معلومات الزبائن، والجدول Orders
الحاوي
على معلومات الطلبيات.
لإظهار قائمة باسم كل
زبون customerName
وعدد
الطلبيات لكل زبون
نكتب الاستعلام :
Select
customerName,(select count(*) from Orders
where Orders.customerID=Customers.customerID)
from Customers;
نلاحظ
في المثال السابق بأنه سيتم
تكرار تنفيذ الاستعلام الفرعي (الظاهر
باللون الأحمر) بعدد
سجلات الزبائن وأن
الاستعلام سيعيد عدد الطلبيات لكل زبون.
ثانياً الاستعلامات الفرعية المستقلة:
وهي الاستعلامات الفرعية التي تكون
مستقلة تمامًا عن
الاستعلامات الرئيسية الحاوية لها،
أي
أن الاستعلام الفرعي سيَُنفَّذ بشكل
كامل ويُمرر القيمة أو مجموعة القيم الناتجة إلى الاستعلام الرئيسي.
مثال:
إذا
كان لدينا جدول Students يحتوي
أسماء الطلاب studentName
وأرقامهم
التسلسلية studentID
وجدول
آخر Grades
يحتوي
علامات الطلاب grade وأرقامهم
التسلسلية studentID
لإعادة
لائحة بأسماء الطلاب الناجحين فقط
نكتب الاستعلام:
Select
studentName from Students where Students.studentID in (select
Grades.studentID
from Grades where Grades.grade>=50);
اعتبرنا درجة النجاح انها 50 .
نلاحظ
في الاستعلام السابق أنه سيتم
تنفيذ الاستعلام الفرعي
(باللون الأحمر) مرة
واحدة فقط، وبصورة مستقلة عن
عدد السجلات في الجدول Students .
انتبه:
تحتاج
الاستعلامات الفرعية المرتبطة باستعلام رئيسي
للكثير من الوقت
والمعالجة بالمقارنة مع
الاستعلامات غير
المرتبطة باستعلامها الرئيسي.
يتطلب
العمل بالاستعلامات الفرعية أحيانًا استخدام حقول من
أكثر من جدول،
فاحرص على عدم
استخدام أسماء حقول متشابهه بل استخدم الصيغة .Table_Name.Field_Name
استعمال الاستعلام الفرعي كعمود من أعمدة الاستعلام الرئيسي
يأخذ
هذا الاستعلام الصيغة:
Select columnA, (subquery) as columnB from Table_Name;
في
الصيغة السابقة سيتم
تنفيذ الاستعلام Subquery
على
كل سجل يقوم الاستعلام الرئيسي بإعادته هذا النوع
من الاستعلامات الفرعية يفيد في توليد علاقة
بين جدول وآخر.
وبناءاً على هذه الصيغة يجب ألا
يعيد الاستعلام الفرعي أكثر من
قيمة واحدة لكل
سجل في سجلات
الاستعلام الرئيسي.
مثال:
لنفرض انه لدينا الجدول Accounts
الذي يحتوي على الارقام التسلسلية للحسابات المصرفية accountID
وقيم ارصدة هذه الحسابات accountBalance
ولنفترض انه لدينا الجدول Clients الذي يحتوي على اسماء اصحاب تلك الحسابات
المصرفية clientName
ورقم الحساب لكل زبون accountID لكي نقوم بإظهار قائمة بأرقام الحسابات
وارصدتها واسماء اصحابها نستخدم الصيغة التالية:
Select
Accounts.accountID, (select clientName from Clients
where
Clients.accountID
= Accounts.accountID)as myClientName,
Accounts.accountBalance
from
Accounts;
المثال السابق يعتبر عيّنه من الاستعلامات
الفرعية المرتبطة بالاستعلام الرئيسي نظراً لكون الاستعلام الفرعي الظاهر باللون
الاحمر لن يعمل وحيداً بل يحتاج الى معلومات من استعلام رئيسي وهي قيم .Accounts.accountID
انتبه:
لاحظ اننا استخدمنا في بعض الصيغ السابقة اسماء
الجداول مع اسماء الحقول مفصولة بنقاط "." وذلك لمنع حدوث خلط في تحديد
تبعية احد الحقول لأي من الجداول .
كذلك انتبة انه لكي تعمل الصيغة في المثال السابق
دون اخطاء يشترط ان يعيد الاستعلام الفرعي قيمة واحدة لكل سجل من سجلات الاستعلام
الرئيسي .
يعتبر استعمال الاستعلام الفرعي كعمود من اعمدة
الاستعلام الرئيسي احد التركيبات المستخدمة بكثرة في الاستعلامات الفرعية .
نكتفي بهذا ونلتقي في الدرس القادم والذي سيكون
بعنوان استعمال الاستعلامات الفرعية ضمن شرط Where
لا تنسى مشاركة هذا مع اصدقائك
كذلك ليصل اليك جديدنا قم بالاشتراك في المدونة
او سجل اعجابك بصفحتنا على الفيس بوك
دمت بخير عزيزنا الزائر
إرسال تعليق
لا تبخل علينا باقتراحك او قم بمشاركة الموضوع ليستفيد الاخرين ايضاً شكرا لزيارتك عزيزي الزائر