الاستعلام الفرعي Subquery في Oracle هو استعلام داخل استعلام آخر. يمكنه توفير قيمة للمقارنة، مثل راتب موظف معروف أو متوسط الرواتب، أو حساب قيمة مرتبطة بكل صف خارجي. نستخدم معرف الموظف للمقارنة بدل افتراض أن الاسم فريد.
تستخدم الأمثلة جداول التدريب في درس إنشاء جداول وبيانات تدريب Oracle. نفّذ إعدادها مرة واحدة في مخطط تدريب قبل الاستعلامات، حتى تتطابق أسماء الأعمدة والنتائج.
مثال SQL قابل للنسخ
SELECT emp_id, emp_name, salary
FROM gc_employees
WHERE salary < (
SELECT salary FROM gc_employees WHERE emp_id = 3
)
ORDER BY emp_id;
SELECT emp_id, emp_name, salary
FROM gc_employees
WHERE salary > (SELECT AVG(salary) FROM gc_employees)
ORDER BY emp_id;
SELECT e.emp_id, e.emp_name, e.salary
FROM gc_employees e
WHERE e.salary > (
SELECT AVG(x.salary)
FROM gc_employees x
WHERE x.dept_id = e.dept_id
)
ORDER BY e.emp_id;نتائج أمثلة التدريب
راتب الموظفة ذات المعرف 3 هو 4000؛ لذلك يرجع المثال الأول Noor براتب 3000. متوسط الرواتب المعروفة في الجدول 5000، فيرجع المثال الثاني Ahmed وAli. يقارن المثال الثالث كل راتب بمتوسط قسم الموظف نفسه، فيرجع Ahmed وOmar.
الصف الواحد وNULL
المقارنة salary < (subquery) تحتاج قيمة مفردة. المفتاح الأساسي emp_id يجعل المرجع محددًا؛ البحث باسم مكرر قد يعيد أكثر من صف ويسبب ORA-01427. إذا لم يرجع الاستعلام الداخلي صفًا تصبح المقارنة مع NULL غير معروفة، فلا يظهر صف مطابق بسبب هذا الشرط.
الاستعلام المترابط
في المثال الثالث يعتمد الحساب الداخلي على e.dept_id. الموظفون بلا قسم لا يطابقون شرط المساواة العادي مع NULL، فلا يدخلون تلقائيًا في مقارنة متوسط قسم. عرّف سياسة التعامل معهم حسب المطلوب. لا تغيّر المقارنة إلى IN أو MAX لمجرد إخفاء خطأ تعدد الصفوف؛ حدد أولًا معنى النتيجة المطلوبة.
الصور والفيديو من الشرح السابق
الكود النصي أعلاه هو النسخة المصححة؛ قد تختلف المواد المرئية السابقة في أسماء المتغيرات أو طريقة التشغيل.







