recent
أخبار ساخنة

الإستعلامات الفرعية في قواعد البيانات Oracle الدرس|6|

الصفحة الرئيسية
الإستعلامات الفرعية Subqueries في اوراكل

الإستعلامات الفرعية في أوراكل 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' );

بمعنى آخر هو مُداخلة إستعلامين فيما بينهم بحيث يكون الإستعلامين مرتبطين ببعض و يكون الإستعلام الخارجي رئيسي.

و الإستعلام الداخلي فرعي و يٌنفَذ الإستعلام الداخلي الفرعي اولاً ثم الإستعلام الخارجي الرئيسي.


إرشادات الإستعلامات الفرعية

  1. يجب وضع الإستعلام الفرعي بين قوسين.
  2. يجب وضع الإستعلام الفرعي يمين معامل المقارنة (= , < , > , <= , >= , <>).
  3. يجب التأكد من إستخدام معاملات اُحادية الصف مع إستعلامات فرعية اُحادية الصف (Single-Row Subquery).
  4. يجب التأكد من إستخدام معاملات متعددة الصفوف مع إستعلامات فرعية متعددة الصفوف (Multiple-Row Subquery).
 

انواع معاملات المقارنة المستخدمة في الإستعلامات الفرعية

  • معاملات احادية الصف مثل (= , < , > , <= , >= , <>) و تُستخدَم مع الإستعلامات الفرعية أُحادية الصف التي ترجع بصف واحد (اي بقيمة واحدة).
  • معاملات متعددة الصفوف (ALL , ANY , IN) و تُستخدَم مع الإستعلامات الفرعية متعددة الصفوف اي التي ترجع بأكثر من قيمة.
 

انواع الإستعلامات الفرعية

  1. الإستعلام في عمود واحد : هي الإستعلامات التي تكون نتيجتها صف واحد فقط و لذلك يستخدم معها معاملات اُحادية الصف (= , < , > , <= , >= , <>).
  2. الإستعلام في عدة اعمدة : هي الإستعلامات التي تكون نتيجتها اكثر من صف و لذلك تُستخدَم معها معاملات متعددة الصفوف (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.

الإستعلامات الفرعية أوراكل 2

مثال 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 ) ;

الإستعلامات الفرعية أوراكل 3

هذا المثال يقوم بعرض أقل راتب من الإدارة رقم 20 و في الإستعلام الآخر الرئيسي يقوم بعرض أقل. راتب إعتماداً على رقم الإدارة بحيث يكون اكبر من اقل راتب.

في الإدارة 20 نلاحظ أنه لم يعرض الإدارة 20 و تم إستخدام جملة الشرط having و ذلك بسبب إستخدام الدالة التجمعية min.

 

الإستعلامات الفرعية متعددة الصفوف

هي إستعلامات فرعية تقوم بإرجاع عدة صفوف من البيانات عند الإشارة لنتيجة الإستعلام الفرعي. في العبارة الشرطية لعبارة الإستعلام الرئيسية.

و يجب إجراء المقارنة بإستخدام رمز مقارنة متعدد الصفوف (IN ، ALL ، ANY).

  1. IN : المساواة بأي قيمة داخل قائمة.
  2. ANY : مقارنة قيمة بأي من قيم داخل قائمة.
  3. ANY : معناها أقل من أكبر قيمة داخل قائمة.
  4. ANY : معناها اكبر من أقل قيمة داخل قائمة.
  5. ALL : مقارنة قيمة بكل ما هو موجود داخل قائمة.
  6. ALL : معناه أقل من أقل قيمة داخل قائمة.
  7. ALL : معناه اكبر من اعلى قيمة داخل قائمة.

الإستعلام المتعدد IN

عرض أسماء و رواتب و ارقام إدارة الموظفين الذين يأخذون رواتب مساوية لأقل راتب في كل إدارة.

SQL> select ename ,sal,deptno
2 from emp 
3 where sal IN (select min(sal) from emp group by deptno);
الإستعلام المتعدد IN قواعدبيانات


قمنا بإيجاد أقل راتب في إدارة هذا, بعمل إستعلام فرعي يرجع بأقل الرواتب في كل إدارة و هي (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')
الإستعلام المتداخل مع ANY قواعد البيانات

في المثال السابق تم عمل إستعلام فرعي لإيجاد رواتب الموظفين المسجلين بالوظيفة (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);
الإستعلامات المتداخلة مع الجميع ALL قواعدبيانات

لأي إستفسار لديكم لا تترددوا بطرحه علينا في التعليقات او الدخول لمجموعتنا في تلجرام و طرحه هناك, فنحن متواجدون دائماً

google-playkhamsatmostaqltradent