0Pricing
SQL Academy · درس

تعبيرات الجداول الشائعة (WITH)

أعد صياغة الاستعلامات المتداخلة في عبارات WITH واضحة، وسلسل CTEs، وتعلّم قواعد التجسيد في PostgreSQL 12 وما بعده.

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

ما هو CTE؟

‏تعبير جدول مشترك (CTE) هو استعلام فرعي مُسمّى يُعرَّف باستخدام WITH:

WITH paid_orders AS (
  SELECT * FROM orders WHERE status = 'paid'
)
SELECT user_id, COUNT(*)
FROM paid_orders
GROUP BY user_id;

لماذا نستخدم CTEs؟

ثلاث فوائد رئيسية:

  • سهولة القراءة — تقسيم استعلام من 200 سطر إلى خطوات مُسمّاة
  • إعادة الاستخدام — الإشارة إلى النتيجة الوسيطة نفسها عدة مرات
  • الاستدعاء التكراري — CTEs هي الوحيدة التي تدعم الاستعلامات التكرارية (في الدرس التالي)

تسلسل CTEs

عرّف عدة CTEs في عبارة WITH واحدة، واستخدم أحدها في التالي:

WITH last_30 AS (
  SELECT * FROM orders WHERE created_at >= NOW() - INTERVAL '30 days'
),
per_user AS (
  SELECT user_id, SUM(total) AS revenue FROM last_30 GROUP BY user_id
)
SELECT u.email, p.revenue
FROM users u
JOIN per_user p ON p.user_id = u.id
ORDER BY p.revenue DESC LIMIT 20;

إعادة استخدام CTE

إذا استُخدمت النتيجة الوسيطة نفسها مرتين، فإن CTE يوضح القصد:

WITH recent_users AS (
  SELECT id FROM users WHERE created_at >= NOW() - INTERVAL '7 days'
)
SELECT 'new orders'  AS metric, COUNT(*) FROM orders
  WHERE user_id IN (SELECT id FROM recent_users)
UNION ALL
SELECT 'new revenue', SUM(total) FROM orders
  WHERE user_id IN (SELECT id FROM recent_users);

تجسيد CTE (في PostgreSQL ‏≤ 11)

كانت إصدارات PG الأقدم تُجسّد ناتج CTE دائمًا — مما يشكّل حاجزًا أمام المُحسِّن. ابتداءً من PG 12، يُضمّن المُحسِّن CTEs داخل الاستعلام افتراضيًا ما لم تحدد خلاف ذلك:

-- Force the old materialise behaviour (rarely needed):
WITH x AS MATERIALIZED (SELECT ...) ...

-- Force inlining (default):
WITH x AS NOT MATERIALIZED (SELECT ...) ...

CTEs التي تُعدّل البيانات

يمكن أن تستخدم CTEs أوامر INSERT/UPDATE/DELETE — وهو مفيد لنقل الصفوف بين الجداول بشكل ذري:

WITH moved AS (
  DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM moved;

CTEs في DML

استخدم RETURNING مع WITH لتنفيذ عملية «العثور والتصرف»:

WITH cancelled AS (
  UPDATE orders SET status = 'cancelled'
  WHERE created_at < NOW() - INTERVAL '14 days'
    AND status = 'pending'
  RETURNING id
)
INSERT INTO audit_log (event, order_id)
SELECT 'auto-cancel', id FROM cancelled;

ترتيب التنفيذ

تعمل CTEs التي تُعدّل البيانات بشكل مستقل ضمن اللقطة نفسها. يرى كل استعلام الحالة BEFORE بدء جميع التعديلات — وهذا أمر مفاجئ لكنه قابل للتنبؤ.

CTEs مقابل الاستعلامات الفرعية وViews

مقارنة:

  • الاستعلام الفرعي — يُعرَّف داخل الاستعلام؛ ويُستخدم مرة واحدة
  • CTE — مُسمّى؛ يُستخدم عدة مرات ضمن الاستعلام؛ ويختفي بعد انتهاء الاستعلام
  • View — مُسمّى؛ محفوظ؛ وقابل لإعادة الاستخدام عبر الاستعلامات

لا تُفرط في استخدام CTEs

إن إحاطة كل شيء بـ CTE تجعل الاستعلامات سهلة القراءة، لكنها قد تخفي التكلفة. ومع النتائج الوسيطة الضخمة، قد يختار المُحسِّن خططًا أسوأ من الخطط الخاصة بـ JOIN مكافئ.

مراجعة

تمنح CTEs أسماءً للاستعلامات الوسيطة.

  • تحسّن سهولة القراءة
  • تتيح إعادة الاستخدام ضمن استعلام واحد
  • مطلوبة للاستدعاء التكراري
  • يُضمّنها PostgreSQL الحديث افتراضيًا

تحقق سريع

ما الكلمة المفتاحية التي تبدأ بها تعبير جدول مشترك؟

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

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

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

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

أعد صياغة الاستعلامات المتداخلة في عبارات WITH واضحة، وسلسل CTEs، وتعلّم قواعد التجسيد في PostgreSQL 12 وما بعده. تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

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

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

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

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

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

  1. الاستعلامات الفرعية العددية والصفية والجدولية
  2. الاستعلامات الفرعية المترابطة وغير المترابطة
  3. تعبيرات الجداول الشائعة (WITH)
  4. CTEs متكررة للتدرجات الهرمية
← العودة إلى SQL Academy