الإستعلامات الفرعية في أوراكل Subqueries
الإستعلامات الفرعية Subqueries هي عبارة عن إستعلامين أو أكثر كل منهما مرتبط بالآخر أو بمدلول الإستعلام الآخر.
مثل إيجاد راتب شخص معيّن و على أثَر هذا الشخص يتم معرفة الموظفين الذين يستلمون نفس الراتب. أو اكبر او اصغر وكل ذلك يرجع إلى جملة الإستعلام التي سوف يتم تحديد المعامل.
الإستعلام الأول :
SQL > SELECT sal FROM emp WHERE ename = 'JONES' ;
الإستعلام الثاني:
SQL > SELECT ename 2 FROM emp 3 WHERE sal > 2975 ;
الإستعلام الفرعي
SQL > SELECT ename
2 FROM emp
3 WHERE sal > (SELECT sal FROM emp WHERE ename = 'JONES' );
بمعنى آخر هو مُداخلة إستعلامين فيما بينهم بحيث يكون الإستعلامين مرتبطين ببعض و يكون الإستعلام الخارجي رئيسي.
و الإستعلام الداخلي فرعي و يٌنفَذ الإستعلام الداخلي الفرعي اولاً ثم الإستعلام الخارجي الرئيسي.
إرشادات الإستعلامات الفرعية
- يجب وضع الإستعلام الفرعي بين قوسين.
- يجب وضع الإستعلام الفرعي يمين معامل المقارنة (= , < , > , <= , >= , <>).
- يجب التأكد من إستخدام معاملات اُحادية الصف مع إستعلامات فرعية اُحادية الصف (Single-Row Subquery).
- يجب التأكد من إستخدام معاملات متعددة الصفوف مع إستعلامات فرعية متعددة الصفوف (Multiple-Row Subquery).
انواع معاملات المقارنة المستخدمة في الإستعلامات الفرعية
- معاملات احادية الصف مثل (= , < , > , <= , >= , <>) و تُستخدَم مع الإستعلامات الفرعية أُحادية الصف التي ترجع بصف واحد (اي بقيمة واحدة).
- معاملات متعددة الصفوف (ALL , ANY , IN) و تُستخدَم مع الإستعلامات الفرعية متعددة الصفوف اي التي ترجع بأكثر من قيمة.
انواع الإستعلامات الفرعية
- الإستعلام في عمود واحد : هي الإستعلامات التي تكون نتيجتها صف واحد فقط و لذلك يستخدم معها معاملات اُحادية الصف (= , < , > , <= , >= , <>).
- الإستعلام في عدة اعمدة : هي الإستعلامات التي تكون نتيجتها اكثر من صف و لذلك تُستخدَم معها معاملات متعددة الصفوف (ALL , ANY , IN).
مثال 1
SQL> select ename , sal ,job ,deptno
2 from emp where deptno=(select deptno from emp where ename ='KING');
في هذا المثال قُمنا بعمل إستعلام يقوم بإيجاد رقم إدارة الموظف 'KING' و ذلك عبر الإستعلام الداخلي الفرعي.
ثم عرض أسماء و رواتب و أرقام إدارات الموظفين في الإدارة رقم 10 التي يوجد بها الموظف 'KING' و هذا هو المطلوب من الإستعلام.
مثال 2
SQL> select ename ,sal
2 from emp
3 where sal=(select min(sal) from emp);
في هذا المثال قُمنا بعرض أقل راتب من جدول الموظفين و على أثر هذا الراتب يتم عرض وظيفة صاحب هذا الراتب و إسمه و راتبه.
لقد إستخدمنا الدالة التجميعية min في الإستعلام الفرعي فقط إذا أتت في الإستعلام الرئيسي فإن جملة الشرط التي تأتي معها تكون having.
مثال 3
إستخدام الدوال التجمعية في الإستعلامات الفرعية ذات الصف الواحد.
SQL> SELECT deptno , MIN(sal)
2 FROM emp
3 GROUP BY deptno
4 HAVING MIN(sal) >( select MIN(sal) from emp where deptno = 20 ) ;
هذا المثال يقوم بعرض أقل راتب من الإدارة رقم 20 و في الإستعلام الآخر الرئيسي يقوم بعرض أقل. راتب إعتماداً على رقم الإدارة بحيث يكون اكبر من اقل راتب.
في الإدارة 20 نلاحظ أنه لم يعرض الإدارة 20 و تم إستخدام جملة الشرط having و ذلك بسبب إستخدام الدالة التجمعية min.
الإستعلامات الفرعية متعددة الصفوف
هي إستعلامات فرعية تقوم بإرجاع عدة صفوف من البيانات عند الإشارة لنتيجة الإستعلام الفرعي. في العبارة الشرطية لعبارة الإستعلام الرئيسية.
و يجب إجراء المقارنة بإستخدام رمز مقارنة متعدد الصفوف (IN ، ALL ، ANY).
- IN : المساواة بأي قيمة داخل قائمة.
- ANY : مقارنة قيمة بأي من قيم داخل قائمة.
- ANY : معناها أقل من أكبر قيمة داخل قائمة.
- ANY : معناها اكبر من أقل قيمة داخل قائمة.
- ALL : مقارنة قيمة بكل ما هو موجود داخل قائمة.
- ALL : معناه أقل من أقل قيمة داخل قائمة.
- ALL : معناه اكبر من اعلى قيمة داخل قائمة.
الإستعلام المتعدد IN
عرض أسماء و رواتب و ارقام إدارة الموظفين الذين يأخذون رواتب مساوية لأقل راتب في كل إدارة.
SQL> select ename ,sal,deptno
2 from emp
3 where sal IN (select min(sal) from emp group by deptno);
قمنا بإيجاد أقل راتب في إدارة هذا, بعمل إستعلام فرعي يرجع بأقل الرواتب في كل إدارة و هي (800,950,1300) ثم. إستخدمنا هذه الرواتب في عرض البيانات بشرط أن يكون الراتب مساوياً لأحد هذه القيم.
نتيجة الإستعلام الفرعي عبارة عن مجموعة من القيم تٌمثّل مجموعة من الصفوف و هي أقل راتب في كل إدارة, تم إستخدام المعامل المتعدد (IN) لأننا هنا نقارن الراتب بمجموعة من الصفوف.
الإستعلام المتداخل مع ANY
يقارن هذا العامل بين قيمة تعبير أو قيمة عمود مع كل قائمة من القيم التي تم إرجاعها بواسطة. الإستعلام الفرعي, طالما كانت نتيجة المقارنة TRUE يُرجع اختبار ANY القيمة TRUE.
عرض أرقام و أسماء و وظائف و رواتب الموظفين الذين رواتبهم أقل من راتب الموظفين اصحاب الوظيفة (CLERK) دون عرض موظفي الوظيفة.
SELECT ename ,sal, job
from emp
where sal <any (select SAL from emp where job = 'CLERK')
في المثال السابق تم عمل إستعلام فرعي لإيجاد رواتب الموظفين المسجلين بالوظيفة (CLERK) و كانت (800 , 950 , 1100 , 1300).
ثم إستخدام هذه القيم في الإستعلام الرئيسي لعرض بيانات الموظفين الذين يأخذون رواتب أقل من أي من هذه القيم.
كما تم إستبعاد الموظفين المسجلين بالوظيفة (CLERK), نُلاحظ أن المعامل (SAL<ANY) معناه. بشرط أن يكون الراتب أقل من أكبر قيمة من القيم من القيم (800 , 950,1100, 1300).
الإستعلامات المتداخلة مع الجميع ALL
يقارن بين قيمة تعبير أو قيمة عمود مع كل قائمة من القيم التي تم إرجاعها بواسطة الإستعلام الفرعي, طالما كانت نتيجة المقارنة FALSE يُرجع اختبار ALL FALSE.
قم بعرض اسماء و أرقام و رواتب الموظفين الذين رواتبهم اكبر من كل المتوسطات الحسابية للمرتبات في كل إدارة.
SQL>SELECT empno , ename , job , sal
2 FROM emp
3 WHERE sal >ALL(select AVG(sal) from emp group by deptno);
لأي إستفسار لديكم لا تترددوا بطرحه علينا في التعليقات او الدخول لمجموعتنا في تلجرام و طرحه هناك, فنحن متواجدون دائماً