0Pricing
Coding Interview Prep · درس

الاستعلامات الفرعية في عبارة FROM (الجداول المشتقة)

تغليف استعلام في جدول افتراضي وسبب إلزامية الأسماء المستعارة

الاستعلامات الفرعية في عبارة FROM (الجداول المشتقة) درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ما هو الجدول المشتق

يُسمى الاستعلام الفرعي في جملة FROM جدولًا مشتقًا (أو عرضًا مضمّنًا). وبدلًا من إعادة قيمة واحدة، فإنه يعيد مجموعة نتائج كاملة يتعامل معها الاستعلام الخارجي كما لو كانت جدولًا حقيقيًا.

  • يمكن أن يحتوي على عدد كبير من الصفوف والأعمدة.
  • يمكنك الاستعلام منه وربطه وتصفية بياناته مثل أي جدول.

يستخدم المحاورون الجداول المشتقة لاختبار قدرتك على تقسيم المشكلة إلى مراحل.

الأسماء المستعارة إلزامية

أهم نقطة يجب الانتباه إليها: يجب أن يكون للجدول المشتق اسم مستعار. ومن دونه، ترفض معظم المحركات الاستعلام.

  • MySQL: Every derived table must have its own alias.
  • Postgres: subquery in FROM must have an alias.

امنحه اسمًا (هنا dept_avg)، وبذلك يمكنك الرجوع إلى أعمدته باستخدام ذلك الاسم.

SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS dept_avg;

لماذا نُجري التجميع المسبق في جدول مشتق

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

الأسلوب النظيف هو حساب المتوسط لكل قسم في جدول مشتق، ثم ربطه مرة أخرى بصفوف التفاصيل. إذ يختزل الجدول المشتق البيانات أولًا إلى صف واحد لكل قسم.

SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;

التصفية حسب نتيجة تجميعية

تتيح لك الجداول المشتقة التصفية حسب نتيجة تجميعية محسوبة من دون تعقيدات HAVING في الاستعلام الخارجي. لنفترض أننا نريد الأقسام التي يتجاوز متوسط راتبها 60000 فقط.

نجري التجميع في الداخل، ثم نطبق في الخارج جملة WHERE عادية على العمود المشتق. ويرى الاستعلام الخارجي avg_salary كأنه عمود عادي.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;

مستويان من التجميع

تتألق الجداول المشتقة عندما تحتاج إلى تجميع ناتج تجميع، وهو سؤال شائع في المقابلات: ما متوسط متوسطات الرواتب لكل قسم؟

لا يمكنك تداخل AVG(AVG(...)) مباشرة. ينتج الاستعلام الداخلي متوسطًا واحدًا لكل قسم، ثم يحسب الاستعلام الخارجي متوسط تلك القيم.

SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d;

تسمية الأعمدة المحسوبة

يحتاج أي تعبير في جدول مشتق إلى اسم مستعار إذا أردت الرجوع إليه من الخارج. وإلا فسيمنح قاعدة البيانات التعبير الداخلي salary * 12 اسمًا تلقائيًا لا يمكنك الاعتماد عليه.

احرص دائمًا على منح الأعمدة المحسوبة أسماء مستعارة؛ فالمحاورون يلاحظون عندما تشير إلى تعبير بلا اسم مستعار وتفترض اسم عمود قد لا يكون موجودًا.

SELECT name, annual_salary
FROM (
  SELECT name, salary * 12 AS annual_salary
  FROM employees
) AS yearly
WHERE annual_salary > 100000;

ربط جدولين مشتقين

يمكنك ربط عدة جداول مشتقة معًا. نقارن هنا عدد الموظفين في كل قسم بإجمالي الرواتب فيه، وذلك بربط استعلامين فرعيين مُجمّعين مسبقًا.

يجيب كل جدول مشتق عن سؤال فرعي واحد، ثم تجمع عملية الربط بين الإجابات لإنتاج التقرير النهائي. وهذا التفكير المرحلي هو بالضبط ما تقدّره مقابلات المستوى المتوسط.

SELECT c.dept_id, c.headcount, p.payroll
FROM (
  SELECT dept_id, COUNT(*) AS headcount
  FROM employees GROUP BY dept_id
) AS c
JOIN (
  SELECT dept_id, SUM(salary) AS payroll
  FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;

النطاق: لا يستطيع الاستعلام الخارجي رؤية ما بداخل الجدول المشتق

إليك قاعدة مهمة: لا يستطيع الاستعلام الخارجي الرجوع إلا إلى الأعمدة التي يكشفها الجدول المشتق في قائمة SELECT الخاصة به. أما الأعمدة المستخدمة داخل الاستعلام الفرعي فقط، فتظل غير مرئية خارجه.

إذا اختار الاستعلام الداخلي dept_id وavg_salary، فلن يكون salary أو name متاحًا خارجه؛ فقد استُهلكا في عملية التجميع. ويختبر المحاورون فهمك لهذا الحد الفاصل في النطاق.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
) AS d;

الجدول المشتق مقابل CTE

غالبًا ما ينتج الجدول المشتق وCommon Table Expression (CTE) خطة التنفيذ نفسها. وقد يسألك المحاورون عن سبب اختيار أحدهما:

  • الجدول المشتق: مضمّن ومناسب للاستخدام لمرة واحدة.
  • CTE (WITH): يُسمى في البداية، وسهل القراءة، وقابل لإعادة الاستخدام إذا تمت الإشارة إليه عدة مرات.

بالنسبة إلى المنطق المتداخل بعمق، يُقرأ تسلسل CTE من الأعلى إلى الأسفل؛ بينما يُقرأ الجدول المشتق من الداخل إلى الخارج.

WITH dept_avg AS (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;

الاستعلام الفرعي LATERAL / المرتبط في FROM

عادةً لا يستطيع الاستعلام الفرعي في FROM الرجوع إلى صفوف الاستعلام الخارجي. لكن LATERAL (في Postgres) أو CROSS APPLY (في SQL Server) يزيل هذا القيد، مما يتيح للجدول المشتق أن يُنفذ لكل صف خارجي.

يتيح ذلك إجراء عمليات بحث عن أعلى N من النتائج لكل صف. إن معرفتك بوجود هذه الكلمة المفتاحية تدل على وعي متقدم حتى في مقابلات المستوى المتوسط.

SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
  SELECT name, salary FROM employees e
  WHERE e.dept_id = d.id
  ORDER BY salary DESC LIMIT 1
) AS top_emp;

عبارة جاهزة للمقابلة

إذا سُئلتم عن الاستعلامات الفرعية في عبارة FROM، قولوا: "الجدول المشتق هو استعلام فرعي في FROM يعيد مجموعة نتائج يستخدمها الاستعلام الخارجي كما لو كانت جدولًا. ويجب أن يكون له اسم مستعار، ولا يستطيع الاستعلام الخارجي رؤية إلا الأعمدة التي يحددها، وهو مثالي لإجراء تجميع مسبق قبل الربط أو لإجراء تجميع على نتيجة تجميع."

أضيفوا أن LATERAL يتيح له الرجوع إلى صفوف الاستعلام الخارجي، وبذلك تكونون قد غطيتم كل الجوانب.

تحقق سريع

اختاروا العبارة المطلوبة دائمًا للاستعلام الفرعي في عبارة FROM.

مراجعة

الجداول المشتقة، بعد تثبيتها:

  • يعيد الاستعلام الفرعي في FROM جدولًا افتراضيًا — صفوفًا وأعمدة كثيرة.
  • يجب أن يكون له اسم مستعار؛ ولا يرى الاستعلام الخارجي إلا الأعمدة التي يحددها.
  • استخدموه لإجراء تجميع مسبق قبل الربط، أو للتصفية بناءً على القيم التجميعية، أو لإجراء تجميع على نتيجة تجميع.
  • يُعد CTE البديل المسمى والواضح؛ ويتيح LATERAL/CROSS APPLY له الرجوع إلى صفوف الاستعلام الخارجي.

التالي: الاستعلامات الفرعية لعضوية المجموعات باستخدام IN وANY وALL.

الأسئلة الشائعة

هل درس «الاستعلامات الفرعية في عبارة FROM (الجداول المشتقة)» مجاني؟

نعم — نص درس «الاستعلامات الفرعية في عبارة FROM (الجداول المشتقة)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «الاستعلامات الفرعية في عبارة FROM (الجداول المشتقة)»؟

تغليف استعلام في جدول افتراضي وسبب إلزامية الأسماء المستعارة تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟

لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الاستعلامات الفرعية في عبارة FROM (الجداول المشتقة)»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟

نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الاستعلامات الفرعية العددية في SELECT وWHERE
  2. الاستعلامات الفرعية في عبارة FROM (الجداول المشتقة)
  3. الاستعلامات الفرعية باستخدام IN وANY وALL
  4. أداء EXISTS مقابل IN
← العودة إلى Coding Interview Prep