الفرق بين Simple subquery and Correlated subquery

TALAL ALMUTIRIمنذ 7 سنوات

بسم الله الرحمن الرحيم

مقدمة:

المقصود ب (Subquery) استعلام داخل استعلام. ويسمى أيضا استعلام داخلي (Inner query) أو استعلام متداخل (Nested query)

A Subquery or Inner query or a Nested query is a query within another SQL query and embedded within the WHERE clause (1).

مثال:


SELECT * FROM Students WHERE CollegeID IN
(SELECT CollegeID FROM Universities WHERE Location = 'Saudi Arabia')

حتى نعرف الفرق بين (Simple subquery) و (Correlated subquery) نحتاج أن نعرف معنى (Inner query and Outer query).

في المثال السابق الجزء:


SELECT * FROM Students WHERE CollegeID IN

يسمى الاستعلام الخارجي (Outer query)

والجزء


(SELECT CollegeID FROM Universities WHERE Location = 'Saudi Arabia')

يسمى الاستعلام الداخلي (Inner query)

 

الفرق بين Simple subquery and Correlated subquery

حتى يتضح الفرق لنفرض أن لدينا جدول خاص بالعملاء ( الرقم – الاسم – العمر – الدولة) وأيضا جدول للدول (الرقم – اسم الدولة) كما في الصورة

Customer.png.61a3ead09b1a5429c5873b6d7361055d.png

Countries.png.77773b7ca2eec691b17e71f9e6d7f901.png

 

الاستعلام الفرعي البسيط (Simple subquery)

يكون فيه الاستعلام الداخلي (Inner query) غير معتمد على الاستعلام الخارجي (Outer query) بمعنى أن يكون الاستعلام الداخلي مستقل ويمكن تنفيذه بشكل مستقل.
 

مثال: استعلام يعرض لنا كامل بيانات العملاء من دولة المملكة العربية السعودية.


SELECT * FROM Customers WHERE CountryID IN
(SELECT CountryID FROM Countries WHERE CountryName ='KSA')

ويكون الناتج:

5910182fe3251_Queryone.png.12c4c8b8b1c24d023374307101b1ea70.png

 

توضيح آلية تنفيذ الـ Simple subquery:

في البداية يتم تنفيذ الاستعلام الداخلي (Inner query)  مرة واحدة فقط. حيث يتم الحصول على رقم دولة (السعودية KSA ). ثم يتم تمرير الناتج للاستعلام الخارجي (Outer query) ويتم الاستفادة منه في الشرط. بمعنى لا يتم تكرار تنفيذ الاستعلام الداخلي.

 

الاستعلام الفرعي المترابط (Correlated subquery)

يكون فيه الاستعلام الداخلي (Inner query) معتمد على الاستعلام الخارجي (Outer query) أي أنه يوجد في الاستعلام الداخلي جزء يعتمد على الاستعلام الخارجي.
 

مثال: استعلام يعرض كامل بيانات الدول المرتبط بها عملاء


SELECT * FROM Countries cnt WHERE cnt.CountryID IN
(SELECT cus.CountryID From Customers cus
 WHERE cus.CountryID = cnt.CountryID)

ويكون الناتج:

59101872d38b6_QueryTwo.png.58888a91b31c136b39544155582e9c16.png

هنا نلاحظ في الجزئية الأخيرة (WHERE cus.CountryID = cnt.CountryID) الموجودة في الاستعلام الداخلي

أن الحقل (CountryID) في جدول الدول (Countries) موجود في الاستعلام الخارجي وهنا تم الاعتماد عليه في الاستعلام الداخلي.

توضيح آلية تنفيذ الـ Correlated subquery:

هنا الموضوع يختلف عن الـ Simple subquery حيث يتم أولا تنفيذ الاستعلام الخارجي حيث يبدأ بالسجل الأول من جدول الدول وهو السعودية ثم يتم تمرير رقم الدولة (1) إلى الاستعلام الداخلي ويتم مطابقة الرقم (1) القادم من الاستعلام الخارجي مع رقم الدولة الموجود في جدول العملاء والموجود في الاستعلام الداخلي (WHERE cus.CountryID = cnt.CountryID) للتأكد من هل العميل مرتبط بهذه الدولة فإذا لم يكون مرتبط ينتقل للسجل الثاني في جدول العملاء ( نحن الآن في السجل الآول من جدول الدول والسجل الثاني من جدول العملاء) وهكذا حتى يتأكد من كامل العملاء.

ثم يتنقل للسجل الثاني من جدول الدول وهو دولة الإمارات رقم (2) ثم يمرره إلى الاستعلام الداخلي ويتم البحث في جدول العملاء ويبدأ المقارنة بنفس الطريقة.

بمعنى أن إذا كان لدينا 3 سجلات في جدول الدول ولدينا 4 سجلات في جدول العملاء في كل سجل من جدول الدول يتم المرور على 4 سجلات من جدول العملاء وهذا يشكل حلقة (loop).

 

الخلاصة:

الفرق بين الاستعلام الفرعي البسيط (Simple subquery) والاستعلام الفرعي المترابط (Correlated subquery) يكون في النقاط التالية:

  • الاستعلام الداخلي في Simple subquery لا يعتمد على الاستعلام الخارجي ويتم تنفيذه بشكل مستقل. أما في Correlated subquery الاستعلام الداخلي يعتمد على الاستعلام الخارجي.
  • في الـ Simple subquery يتم أولاً تنفيذ الاستعلام الداخلي مرة واحدة فقط ولا يشكل حلقة (loop). أما في Correlated subquery يتم تنفيذ الاستعلام الخارجي أولاً ومع كل سجل من الاستعلام الخارجي يتم تنفيذ الاستعلام الداخلي وذلك يشكل حلقة (Loop).
  • الـ Simple subquery أسرع من حيث الأداء بناء على النقطة الثانية.(2)

 

(1): https://www.tutorialspoint.com/sql/sql-sub-queries.htm

(2): http://stackoverflow.com/a/21036822

 

تمت بحمد الله.

Talal Almutairi

https://twitter.com/talalsql

كلمات دليلية:
0
إعجاب
5300
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !