TOP

الدرس SQL 9. الاستعلامات الفرعية

حتى الآن، كنا نحصل على البيانات من قاعدة البيانات باستخدام استعلامات بسيطة وعبارة SELECT واحدة. ومع ذلك، كل نفس، سنحتاج في كثير من الأحيان إلى تحديد البيانات التي تلبي العديد من الشروط، وهنا لا يمكننا الاستغناء عن الاستعلامات المتقدمة. لهذا، في SQL هناك استعلامات فرعية أو استعلامات متداخلة، حيث يتم تضمين عبارة SELECT داخل أخرى.

الاستعلام الفرعي عبارة عن عبارة SELECT متداخلة داخل SELECT، SELECT...INTO، INSERT...INTO، DELETE، UPDATE، أو داخل استعلام فرعي آخر.

يجب وضع نص الاستعلام الفرعي بين قوسين. غالبًا ما يتم استخدام الاستعلامات الفرعية بدلاً من ربط الجداول (JOIN).


1. التصفية باستخدام الاستعلامات الفرعية

جداول قاعدة البيانات المستخدمة في DBMS Access هي جداول علائقية، أي أنه يمكن ربط جميع الجداول ببعضها البعض بواسطة الحقول المشتركة. لنفترض أننا قمنا بتخزين البيانات في جدولين مختلفين ونحتاج إلى تحديد البيانات في أحدهما، اعتمادًا على البيانات الموجودة في الآخر. لهذا، سنقوم بإنشاء جدول آخر في قاعدة البيانات الخاصة بنا. سيكون هذا، على سبيل المثال، الجدول Sellers الذي يحتوي على معلومات حول الموردين:

الآن لدينا جدولان - Sumproduct وSellers لهما نفس الحقل City. لنفترض أننا بحاجة إلى حساب عدد المنتجات التي تم بيعها في كندا وحدها. سوف تساعدنا الاستعلامات الفرعية على القيام بذلك. لذا، دعونا أولاً نكتب استعلامًا لعينة من المدن الموجودة في كندا:

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

لنمرر الآن هذه البيانات إلى الاستعلام التالي، والذي سيحدد البيانات من الجدول Sumproduct:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN ('Montreal','Toronto')

يمكننا أيضًا دمج هذين الطلبين في طلب واحد. وبالتالي، سيكون الطلب الأول الذي يقوم بتمرير بيانات المخرجات هو الطلب الرئيسي، والطلب الثاني الذي يقوم بتمرير بيانات الإدخال سيكون طلبًا مساعدًا (استعلام فرعي). لإدراج استعلام فرعي، سنستخدم البناء WHERE ... IN (...)، والذي تمت مناقشته في القسم تصفية المتقدمة:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN (SELECT City 
               FROM Sellers 
               WHERE Country = 'Canada')

يمكننا أن نرى أننا حصلنا على نفس البيانات كما هو الحال مع استعلامين منفصلين. وبنفس الطريقة، يمكننا زيادة عمق تداخل الاستعلامات عن طريق تداخل الاستعلامات الفرعية عدة مرات كما نريد.

2. استخدام الاستعلامات الفرعية كحقول التسوية

يمكننا أيضًا استخدام الاستعلامات الفرعية كحقول محسوبة. لنعرض مثلاً عدد المنتجات المباعة لكل بائع باستخدام الاستعلام التالي:

Run SQLSELECT Seller_name, (SELECT SUM(Quantity) 
                     FROM Sumproduct 
                     WHERE Sellers.City = Sumproduct.City) AS Qty 
FROM Sellers

تعرض العبارة الأولى SELECT عمودين - Seller_name وQty. يتم حساب الحقل Qty، ويتم تشكيله نتيجة لتنفيذ الاستعلام الفرعي، وهو محاط بين قوسين دائريين. يتم تنفيذ هذا الاستعلام الفرعي مرة واحدة لكل سجل في الحقل Seller_name، وسيتم تنفيذه أربع مرات إجمالاً منذ تحديد أربعة أسماء للبائعين.

أيضًا، في الاستعلام الفرعي، تؤدي جملة WHERE وظيفة الانضمام، لأنه بمساعدة WHERE قمنا بربط الجدولين بواسطة حقل City، باستخدام الأسماء الكاملة للأعمدة (Table.Field).