شرح sql بالعربي - استعمال الاستعلامات الفرعية ضمن شرط where شرح sql بالعربي - استعمال الاستعلامات الفرعية ضمن شرط where - اقرا معي وتعلم على الانترنت

شرح sql بالعربي - استعمال الاستعلامات الفرعية ضمن شرط where

اخذنا في الدرس السابق الاستعلامات الفرعية اليوم نلتقي بكم في استعمال الاستعلامات الفرعية ضمن شرط where  .

شرح sql بالعربي

هذا الاستعلام يأخذ الصيغة التالية
Select columnA, columnB from Table_Name where columnB=(Subquery);
في الصيغة السابقة يجب ان يعيد Subquery قيمة وحيدة .

لاحظ في الصيغة أن نتيجة الاستعلام الفرعي دخلت كجزء من الشرط في تعبير where .

مثال :
اذا كان لدينا جدول وليكن Tickets يحتوي على المخالفات المرورية للسيارات والجدول Owners الذي يحتوي على ارقام اللوحات للسيارات المخالفة carNumber واسماء اصحابها ownerName لإظهار اسم صاحب السيارة ownerName التي ارتكب المخالفة رقم 1234، نكتب الصيغة التالية :
Select ownerName, Owners.carNumber from Owners
where Owners.carNumber=(select Tickets.carNumber from tickets
where ticketNumber=1234);

الاستعلامات الفرعية التي تعيد مجموعة من القيم :

لكي لا يفشل الاستعلام اشترطنا في كلامنا السابق عن الاستعلام الفرعي ان يعيد الاستعلام الفرعي قيمة وحيدة ..
ولكن لكي نتمكن من استخدام الاستعلامات الفرعية التي تعيد اكثر من قيمة علينا ان نستخدم التعبير IN لكن يجب مراعاة اعادة حقلا واحد فقط اذا ستكون الصيغة :
Select columnA, columnB from Table_Name where columnC IN(Subquery);

لا حظ استخدمنا هنا الشرط IN لكن يشترط في الاستعلام الفرعي من هذا النوع ان يعيد قيم عمود واحد فقط أي يكون من الشكل
Select column1 from Table1;

مثال
لنعود لمثالنا السابق مثال المخالفات المرورية للحصول على قائمة بأسماء الاشخاص الذين لديهم مخالفات يكون شكل الاستعلام كالتالي :
Select ownerName from Owners where Owners.carNumber IN
(select Distinct Tickets.carNumber from Tickets);

استخدمنا هنا الاستعلام الفرعي لاعادة ارقام السيارات التي لها مخالفات في سجل المخالفات مع التخلص من التكرار باستخدام الكلمة Distinct  .

استخدام تعبيرات Any و All و Exists مع الاستعلامات الفرعية :

التعبير Exists

يستخدم هذا التعبير للتحقق من اعادة الاستعلام الفرعي الذي يلية لأي سجل وياخذ التعبير كاملا القيمة True في حال ارجع الاستعلام الفرعي سجلاً او اكثر والقيمة False اذا لم يرجع الاستعلام الفرعي أي سجل .
وتكتب الصيغة كالتالي
Select columnA, columnB from Table_Name where Exists (Subquery);

مثال
اذا كان لدينا الجدول Orders بجميع الطلبيات الخاصة بشركة ما ، والذي يحتوي على رقم الطلبية orderID ونوعها orderType ورقم الزبون clientID  الذي طلبها . وجدول اخر Clients يحتوي على اسماء الزبائن وارقامهم clientID لكي نظهر قائمة باسماء الزبائن الذين قاموا سابقا بإرسال طلبية من نوع " تجهيزات كهربائية" نستخدم الصيغة التالية
Select Clients.clientName from Clients where Exists
( select * from Orders
where Orders.clientID = Clients.clientID
and
orderType='تجهيزات كهربائية ';)

التعبير All

يستخدم للتحقق من كون جميع القيم المعادة من استعلام فرعي تحقق شرطا ما في تعبير where التابع للاستعلام الرئيسي :
وتكتب صيغته كالتالي
Select columnA from TableA
where columnA > All from (select columnB from TableB);

حيث يتم هنا اختيار السجلات من الجدول A بحيث تكون كل قيمة من قيم الحقل columnA اكبر من جميع القيم التي يعيدها الاستعلام الفرعي أي من جميع قيم columnB في الجدول TableB .

مثال
تريد الجهات المعنية مقارنة الأرقام Time التي سجلها العداؤون في بطولة معينة والمحفوظة مع أسمائهم Name في جدول currentRecords بالأرقام المسجلة في جدول أرقامهم القديمة oldRecords وذلك لاستخلاص قائمة بأسماء العدائين الذين حطمت أرقامهم جميع الأرقام القديمة oldTime  .
للحصول على تلك القائمة نستخدم التعبير
Select Name from currentRecords
where time < All (select oldTime from oldRecords);

التعبير ANY

يستخدم هذا التعبير للتحقق من كون قيمة أو أكثر من القيم المعادة من استعلام فرعي، تحقق شرطًا واحدًا على الأقل من شروط تعبير Where الخاص بالاستعلام الرئيسي .
وتكتب الصيغة كالتالي
Select columnA from TableA
where columnA > ANY from (select columnB from TableB);

سيتم هنا اختيار السجلات من الجدول A حيث تكون كل قيمة من قيم الحقل columnA اكبر من قيمة واحدة على الاقل من القيم المعادة من الاستعلام الفرعي أي من قيمة واحدة على الاقل من قيم column في الجدول TableB .

مثال
تريد الجهات المعنية مقارنة الرقام Time التي سجلها العداؤون في بطولة معينة والمحفوظة مع اسمائهم Name في جدول currentRecords بالارقام القياسية العالمية المسجلة في جدول bestRecords وذلك لاستخلاص قائمة باسماء العدائين الذين حطمت ارقامهم احد الارقام القياسية bestTime .
سنكتب الصيغة كالتالي:
Select Name from currentRecords
where time < ANY (select bestTime from bestRecords);

اكتفي بهذا ونلتقي في التدوينة القادمة

لا تنسى مشاركة هذا مع اصدقائك لدعمنا وتشجيعنا لتقديم المزيد 
شارك الموضوع
تعليقات

إرسال تعليق

لا تبخل علينا باقتراحك او قم بمشاركة الموضوع ليستفيد الاخرين ايضاً شكرا لزيارتك عزيزي الزائر

محتوى قد يهمك

.