0Pricing
SQL Interview Prep · درس

كتابة أول CTE لك

صياغة WITH الأساسية ومتى يحسن CTE قابلية القراءة مقارنة باستعلام فرعي

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

ما هي CTE فعلًا

‏التعبير الجدولي الشائع (CTE) هو مجموعة نتائج مؤقتة مُسمّاة تُعرَّف باستخدام الكلمة المفتاحية WITH، ولا تكون موجودة إلا طوال مدة استعلام واحد. يحب المحاورون CTEs لأنها تكشف قدرتك على تنظيم المنطق بوضوح.

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

بنية WITH الأساسية

يبدأ كل CTE بـ WITH، ثم اسم، ثم الكلمة المفتاحية AS، ثم استعلام بين قوسين. بعد قوس الإغلاق، تكتب عبارة عادية تستخدم CTE باسمه.

  • WITH cte_name AS ( ... ) يعرّف الكتلة.
  • الاستعلام الذي يلي القوس مباشرة هو الاستعلام الرئيسي.
  • يتصرف اسم CTE كاسم جدول يمكنك تنفيذ SELECT منه.
WITH recent_orders AS (
    SELECT *
    FROM orders
    WHERE order_date >= '2024-01-01'
)
SELECT *
FROM recent_orders;

لماذا لا نستخدم استعلامًا فرعيًا فحسب

يمكن كتابة المنطق نفسه كاستعلام فرعي مضمن في جملة FROM. فلماذا يسأل المحاورون عن CTEs؟

  • قابلية القراءة: تُقرأ الخطوة المسماة من الأعلى إلى الأسفل كالوصفة.
  • إعادة الاستخدام: يمكنك الإشارة إلى CTE نفسه عدة مرات بدلًا من تكرار الاستعلام الفرعي.
  • سهولة تصحيح الأخطاء: يمكنك تنفيذ SELECT على CTE وحده لفحصه.

الإجابة الصحيحة عادةً في المقابلة هي: استخدم CTE عندما يجعل الاستعلام أسهل قراءةً وصيانةً.

مثال تطبيقي: التصفية ثم التجميع

لنفترض أن السؤال هو: اعثر على إجمالي الإيرادات من الطلبات التي أُجريت هذا العام. يتيح لك CTE عزل خطوة التصفية، ثم إجراء التجميع على النتيجة المسماة.

يتعامل الاستعلام الرئيسي مع recent_orders كما لو كان جدولًا حقيقيًا، ما يجعل التجميع واضحًا ونظيفًا.

WITH recent_orders AS (
    SELECT amount
    FROM orders
    WHERE order_date >= '2024-01-01'
)
SELECT SUM(amount) AS total_revenue
FROM recent_orders;

تسمية أعمدة الناتج

يمكنك إعادة تسمية الأعمدة التي يعرّضها CTE من خلال إدراجها مباشرةً بعد اسم CTE. ويفيد ذلك عندما ينتج الاستعلام الداخلي تعبيرات أو عندما تريد أسماء أوضح في الخطوات اللاحقة.

إذا زوّدت قائمة أعمدة، فيجب أن يطابق عددها عدد الأعمدة التي يُعيدها الاستعلام الداخلي، وإلا فستُصدر قاعدة البيانات خطأً.

WITH revenue (region, total) AS (
    SELECT region, SUM(amount)
    FROM orders
    GROUP BY region
)
SELECT region, total
FROM revenue
ORDER BY total DESC;

CTE مجرد استعلام مُسمّى

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

وهذا يعني أن كل ما هو قانوني في SELECT عادي قانوني داخل CTE: عمليات الربط، وGROUP BY، وWHERE، ودوال النوافذ، وغير ذلك.

مثال أعمق: CTE مع عملية ربط

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

لاحظ كيف تُقرأ العبارة الرئيسية تقريبًا كجملة طبيعية: من العملاء، اربط أعداد طلباتهم.

WITH order_counts AS (
    SELECT customer_id, COUNT(*) AS num_orders
    FROM orders
    GROUP BY customer_id
)
SELECT c.name, oc.num_orders
FROM customers c
JOIN order_counts oc
    ON oc.customer_id = c.id;

موضع CTE في الاستعلام

يجب أن تأتي كتلة WITH قبل العبارة التي تستخدمها. ولا يكون CTE مرئيًا إلا للعبارة الواحدة التي تلي تعريفه مباشرةً.

  • لا يمكنك الإشارة إلى CTE في استعلام منفصل لاحق.
  • لا يمكن إعادة استخدام CTE معرّف لعملية SELECT في SELECT آخر يُنفَّذ بعده.
  • ينتهي النطاق عند الفاصلة المنقوطة التي تنهي العبارة.

تعمل CTEs مع INSERT وUPDATE وDELETE

سؤال متابعة شائع: لا تقتصر CTEs على SELECT. ففي معظم قواعد البيانات الحديثة، يمكنك إرفاق عبارة WITH بعبارات تعديل البيانات أيضًا.

يتيح لك ذلك حساب مجموعة من الصفوف مرة واحدة ثم تنفيذ إجراء عليها، وهو أوضح بكثير من وضع استعلام فرعي متداخل داخل جملة WHERE.

WITH stale AS (
    SELECT id
    FROM sessions
    WHERE last_seen < NOW() - INTERVAL '30 days'
)
DELETE FROM sessions
WHERE id IN (SELECT id FROM stale);

أخطاء المبتدئين الشائعة

يراقب المحاورون هذه الأخطاء:

  • نسيان الاستعلام الرئيسي بعد CTE؛ فكتلة WITH وحدها ليست عبارة مكتملة.
  • وضع فاصلة منقوطة بين CTE والاستعلام الرئيسي.
  • توقّع استمرار CTE عبر عبارات متعددة.
  • عدم تطابق قائمة أسماء الأعمدة الاختيارية مع أعمدة الاستعلام الداخلي.

كيف تتحدث عن CTEs في مقابلة

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

إن إظهار أنك تختار CTEs من أجل الوضوح وإعادة الاستخدام، لا بشكل أعمى، يدل على نضج في المستوى المتوسط. اذكر أن CTE لا يجعل الاستعلام أسرع بطبيعته؛ فقيمته الأساسية هي قابلية القراءة.

تحقق سريع

اختبر فهمك للصياغة الأساسية لـ CTE ونطاقها.

مراجعة: أول CTE لك

تعلّمت أن CTE تستخدم WITH name AS ( ... ) لتسمية مجموعة نتائج مؤقتة، ثم يُشار إليها مثل الجدول في العبارة التالية.

  • تحسّن CTEs قابلية القراءة وإعادة الاستخدام وسهولة تصحيح الأخطاء مقارنةً بالاستعلامات الفرعية المضمّنة.
  • يقتصر نطاقها على عبارة واحدة، ثم تختفي.
  • تعمل مع SELECT وكذلك مع INSERT/UPDATE/DELETE.
  • لا تحسّن الأداء تلقائيًا.

التالي: ربط عدة CTEs في مسار معالجة.

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

هل درس «كتابة أول CTE لك» مجاني؟

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

ماذا ستتعلم في «كتابة أول CTE لك»؟

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

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

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

كم من الوقت يستغرق درس «كتابة أول CTE لك»؟

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

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

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

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

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