الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 4 من 416/57 في الدورة~12 min
دروس الوحدة (4/4)

استعلام داخل آخر: الاستعلامات الفرعية

لقد تعلمت كيفية الاستخراج والتصفية والتجميع والانضمام والتحويل. هناك هي فكرة أساسية أخيرة: وضع استعلام داخل استعلام آخر. هذه هي تسمى الاستعلامات الفرعية وهي الخطوة التي تتيح لك الإجابة على الأسئلة مثل "من يكسب أعلى من المتوسط؟" أو _"أي الأقسام لديها شخص ما مخصص لمشروع؟" _.

بناء الجملة الأساسي

الاستعلام الفرعي هو SELECT بين قوسين، يُستخدم بدلاً من استعلام واحد القيمة أو قائمة القيم في استعلام آخر:

SQL
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM   employees
WHERE  salary > (SELECT AVG(salary) FROM employees);

يقوم المحرك بتشغيل الاستعلام الفرعي أولاً — SELECT AVG(salary) FROM employees تُرجع رقمًا واحدًا — ثم تستخدم هذا الرقم في WHERE الخارجي كأنك كتبتها بخط يدك هذه هي الميزة بالتحديد: أنت تفعل ذلك لا تحتاج إلى معرفة المتوسط مقدمًا، حيث تقوم SQL بحسابه نيابةً عنك.

"الأنواع الثلاثة" الأكثر شيوعًا

1. استعلام فرعي يُرجع قيمة واحدة

المثال أعلاه: الاستعلام الفرعي ينتج صف واحد، عمود واحد (يسمى العددية). يمكنك استخدامه مع =، >، < وما إلى ذلك.

SQL
-- Employee with the highest salary:
SELECT first_name, last_name
FROM   employees
WHERE  salary = (SELECT MAX(salary) FROM employees);

2. الاستعلام الفرعي يعيد القائمة

ينتج الاستعلام الفرعي عمودًا واحدًا والعديد من الصفوف. تستخدمه مع محمي_INLINE_6:

SQL
-- Departments that have at least one employee:
SELECT name
FROM   departments
WHERE  id IN (SELECT DISTINCT department_id
              FROM employees
              WHERE department_id IS NOT NULL);

3. الاستعلام الفرعي كـ "جدول" (من)

يمكن للاستعلام الفرعي أيضًا أن يحل محل جدول في FROM. ومن المفيد أن قم بحساب التجميعات مسبقًا ثم قم بتصفيتها أو الانضمام إليها:

SQL
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM   departments AS d
JOIN  (SELECT department_id, AVG(salary) AS stipendio_medio
       FROM employees
       GROUP BY department_id) AS medie
   ON d.id = medie.department_id
WHERE  medie.stipendio_medio > 40000;

استعلام فرعي أو الانضمام؟ متى تستخدم أي

غالبًا ما يمكن الحصول على نفس النتيجة باستخدام JOIN أو باستخدام استعلام فرعي. القاعدة الأساسية:

  • تصفية صفوف جدول واحد بناءً على خاصية جدول آخر ("الموظفون الذين تكون أقسامهم...")، IN (subquery) سهلة القراءة للغاية.
  • لدمج الأعمدة من جداول متعددة في النتيجة، استخدم JOIN.
  • ** لحساب إجمالي ** واستخدامه كعتبة ("فوق متوسط")، الاستعلام الفرعي العددي هو الاختيار الطبيعي.

من الناحية العملية، سترى كليهما: غالبًا ما يقوم محرك SQL بتحسينهما بنفس الطريقة الطريق. اختر النموذج الذي يقرأ بشكل أفضل.

جربه

تمرين#sql.m4.l4.e1
المحاولات: 0جارٍ التحميل…

ابحث عن الاسم الأول (الاسم الأول)، والاسم الأخير (اسم العائلة)، والراتب (الراتب) للموظفين الذين يكسبون أكثر من متوسط ​​الشركة. ثلاثة أعمدة.

جارٍ تحميل المحرر…
إظهار التلميح

يستبدل ؟ باستخدام الاستعلام الفرعي SELECT AVG(salary) FROM للموظفين - يقوم بإرجاع رقم واحد لاستخدامه كحد أدنى.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m4.l4.e2
المحاولات: 0جارٍ التحميل…

قم بإدراج اسم (departments.name) الأقسام التي لديها موظف واحد على الأقل براتب أكبر من 50000. استخدم استعلام فرعي مع IN. ترتيب أبجديا.

جارٍ تحميل المحرر…
إظهار التلميح

يقوم الاستعلام الفرعي الداخلي بإرجاع معرفات الأقسام التي لديها موظفين براتب> 50000. ثم أين يوجد المعرف (...) في الاستعلام الخارجي.

الحل متاح بعد 3 من المحاولات