اخذنا في الدرس السابق الاستعلامات الفرعية اليوم
نلتقي بكم في استعمال الاستعلامات الفرعية ضمن شرط where .
هذا الاستعلام يأخذ الصيغة التالية
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);
اكتفي بهذا ونلتقي في التدوينة القادمة
لا تنسى مشاركة هذا مع اصدقائك لدعمنا وتشجيعنا
لتقديم المزيد
شكرا لك
ردحذفليتك تشرح هذا بالفيديو
سأقوم بذلك اذا سمحت لي الفرصه ... اشكرك على مرورك الرائع
حذفافضل شرح sql بالعربي
ردحذف