0Pricing
Coding Interview Prep · درس

إعادة هيكلة الاستعلامات المتداخلة إلى CTEs

نمط المقابلات المباشرة: تحويل استعلام متداخل غير قابل للقراءة إلى CTEs متسلسلة

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

إعادة الهيكلة في المقابلة المباشرة

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

يشرح هذا الدرس الخطوات نفسها بالتفصيل حتى تتمكن من تنفيذها بهدوء على السبورة.

ابدأ بالاستعلام الداخلي الأعمق

تُنفَّذ الاستعلامات الفرعية المتداخلة من الداخل إلى الخارج من الناحية المفاهيمية. لذلك اقرأ الاستعلام بالطريقة نفسها: ابحث أولًا عن SELECT الأعمق المحاط بالأقواس؛ فهذه هي أول مرحلة في مسار المعالجة.

امنحها اسمًا وصفيًا، وانقلها إلى CTE. وكل ما كان يشير إلى تلك الكتلة الداخلية سيشير الآن إلى اسم CTE بدلًا منها.

SELECT *
FROM (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
) t
WHERE t.total > 1000;

انقل مستوى واحدًا إلى CTE

خذ ذلك الجدول المشتق الداخلي وحوّله إلى CTE. يبقى الاستعلام الخارجي كما هو، باستثناء أنه يقرأ الآن من CTE المُسمّاة.

تزيل هذه الخطوة الواحدة بالفعل طبقة من التداخل الذهني، وتمنح الخطوة اسمًا ذا معنى.

WITH spend AS (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
)
SELECT *
FROM spend
WHERE total > 1000;

مثال متداخل فعلًا

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

الاستعلام صحيح، لكنه صعب القراءة. سنفككه مرحلةً بعد أخرى.

SELECT AVG(o.amount) AS avg_order
FROM orders o
WHERE o.customer_id IN (
    SELECT customer_id
    FROM (
        SELECT customer_id, SUM(amount) AS total
        FROM orders
        GROUP BY customer_id
    ) s
    WHERE s.total > 1000
);

سمِّ المرحلة الأولى

تحسب الكتلة الأعمق إجمالي الإنفاق لكل عميل. انقلها إلى CTE باسم spend. والآن تكتفي الطبقة الوسطى بتصفية CTE تلك.

لاحظ كيف يقلل كل استخراج عمق التداخل بمقدار واحد، ويضيف اسمًا يشرح نفسه.

WITH spend AS (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
)
SELECT AVG(o.amount) AS avg_order
FROM orders o
WHERE o.customer_id IN (
    SELECT customer_id FROM spend WHERE total > 1000
);

سمِّ المرحلة الثانية

استخرج المرشح المطبق على spend إلى CTE خاصة به باسم big_spenders. ويصبح الاستعلام الرئيسي المتبقي عملية ضم مسطحة أو اختبار انتماء إلى مجموعة ذات اسم واضح.

أصبحت لكل مرحلة الآن مسؤولية واحدة، وهذا هو السِمَة المميزة لـ SQL النظيفة.

WITH spend AS (
    SELECT customer_id, SUM(amount) AS total
    FROM orders GROUP BY customer_id
),
big_spenders AS (
    SELECT customer_id FROM spend WHERE total > 1000
)
SELECT AVG(o.amount) AS avg_order
FROM orders o
JOIN big_spenders b ON b.customer_id = o.customer_id;

حافظ على المعنى أثناء إعادة الهيكلة

القاعدة الذهبية: يجب ألا تؤدي إعادة الهيكلة إلى تغيير النتائج. انتبه إلى المزالق التي تغيّر الناتج بصمت:

  • قد يؤدي تحويل IN إلى JOIN إلى إنشاء صفوف مكررة إذا لم يكن الجانب الأيمن مميزًا.
  • يتصرف NOT IN مع قيم NULL بصورة مختلفة عن NOT EXISTS.
  • يجب أن يبقى مستوى التجميع كما هو.

اذكر هذه المخاطر بصوت مسموع لإظهار حرصك.

التحقق من إعادة الهيكلة

كيف تثبت أن إعادة الهيكلة حافظت على السلوك نفسه؟ اذكر أنك ستشغّل النسختين وتقارن عدد الصفوف وقيمة المجموع الاختباري، أو تقارن مجموعات النتائج باستخدام عينة.

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

SELECT COUNT(*), SUM(amount)
FROM orders
WHERE customer_id IN (SELECT customer_id FROM big_spenders);

متى لا نعيد الهيكلة

إعادة الهيكلة ليست دائمًا تحسينًا. قد تكون الاستعلامات الفرعية البسيطة والأحادية الطبقة أوضح إذا تُركت كما هي، كما أن تقسيمها بإفراط إلى العديد من CTEs الصغيرة قد يضر بقابلية القراءة.

استخدم حكمك: أعد الهيكلة عندما يحجب التداخل الهدف أو عندما يُعاد استخدام المنطق. أخبر المُحاوِر أنك ستتوقف بمجرد أن يُقرأ الاستعلام من الأعلى إلى الأسفل على هيئة خطوات منفصلة ومُسمّاة.

قائمة التحقق من إعادة الهيكلة

طريقة قابلة للتكرار يمكنك سردها:

  • اقرأ من الداخل إلى الخارج للعثور على أعمق استعلام فرعي.
  • انقله إلى CTE مُسمّى.
  • كرّر العملية باتجاه الخارج، طبقة واحدة في كل مرة.
  • سمِّ كل مرحلة وفقًا لما تنتجه.
  • تأكد من عدم تغيّر النتائج (وانتبه إلى حالات IN/JOIN ومشكلات NULL).

بهذا يتحول الاستعلام المتداخل المخيف إلى إعادة كتابة هادئة ومتدرجة.

التواصل أثناء إعادة الهيكلة

تحدّث أثناء عملك: الكتلة الأعمق تحسب الإنفاق لكل عميل، لذا سأسميها spend. والطبقة التالية تصفّي أصحاب الإنفاق المرتفع. ثم يحسب الاستعلام الخارجي متوسط مبالغ طلباتهم.

يقيّم المُحاوِرون قدرتك على التواصل بقدر تقييمهم لصحة الحل. وإعادة الهيكلة المشروحة مرحلةً بمرحلة تُظهر تمامًا النضج المهني المتوسط المستوى الذي يبحثون عنه.

تحقق سريع

حدّد الخطوة الأولى الصحيحة عند إعادة هيكلة استعلام متداخل بعمق إلى CTEs.

مراجعة: إعادة الهيكلة باستخدام CTEs

تعلّمت طريقة هادئة وقابلة للتكرار لإعادة الهيكلة: اقرأ من الداخل إلى الخارج، وانقل أعمق استعلام فرعي إلى CTE مُسمّى، ثم اعمل باتجاه الخارج طبقة واحدة في كل مرة.

  • سمِّ كل مرحلة وفقًا لما تنتجه.
  • حافظ على الدلالة؛ وانتبه إلى التكرارات الناتجة عن الفرق بين IN وJOIN وإلى مشكلات NULL.
  • تحقق من صحة النتائج بمقارنة الأعداد وبعض الصفوف النموذجية.
  • لا تقسّم الاستعلام بإفراط؛ توقف عندما يُقرأ على هيئة خطوات واضحة ومُسمّاة.

بهذا يكتمل درس CTE؛ ويمكنك الآن إعادة الهيكلة بثقة في مقابلة مباشرة.

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

هل درس «إعادة هيكلة الاستعلامات المتداخلة إلى CTEs» مجاني؟

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

ماذا ستتعلم في «إعادة هيكلة الاستعلامات المتداخلة إلى CTEs»؟

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

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

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

كم من الوقت يستغرق درس «إعادة هيكلة الاستعلامات المتداخلة إلى CTEs»؟

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

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

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

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

  1. كتابة أول CTE لك
  2. تسلسل عدة CTEs
  3. CTE مقابل الاستعلام الفرعي مقابل الجدول المؤقت
  4. إعادة هيكلة الاستعلامات المتداخلة إلى CTEs
← العودة إلى Coding Interview Prep