0Pricing
SQL Academy · درس

الاستعلامات الفرعية المترابطة وغير المترابطة

افهم الاستعلامات الفرعية المترابطة التي تشير إلى الصف الخارجي، وخصائص أدائها، ومتى يتفوق EXISTS على IN.

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

الاستعلامات الفرعية غير المرتبطة

لا يُشير الاستعلام الفرعي غير المرتبط إلى الصف الخارجي. ويُنفَّذ مرة واحدة، ثم يُعاد استخدام نتيجته:

SELECT * FROM users
WHERE id IN (
  SELECT user_id FROM orders WHERE status = 'paid'
);

الاستعلامات الفرعية المرتبطة

يُشير الاستعلام الفرعي المرتبط إلى الصف الخارجي — ومنطقيًا يُعاد تشغيله لكل صف خارجي:

SELECT u.id, u.email
FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders o
  WHERE o.user_id = u.id
    AND o.total > 1000
);

كيفية معرفة الفرق

إذا كان SELECT الداخلي يُشير إلى عمود من FROM الخارجي، فهو استعلام مرتبط.

آثار الأداء

التعقيد النظري للاستعلام الفرعي المرتبط بطريقة ساذجة هو O(outer × inner). وغالبًا ما تعيد المخططات الحديثة كتابته إلى semi-join أو hash join — لكن ينبغي أن تكتبوا الصيغة الأبسط متى أمكن.

EXISTS مقابل IN

للبحث عن «تطابق واحد على الأقل»:

-- IN with non-correlated subquery (often the planner's favourite):
SELECT u.* FROM users u
WHERE u.id IN (SELECT user_id FROM orders);

-- EXISTS with correlated subquery (NULL-safe alternative):
SELECT u.* FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);

يتفوق NOT EXISTS دائمًا على NOT IN

يتعطل NOT IN عندما تحتوي المجموعة الداخلية على NULL، أما NOT EXISTS فلا يتعطل. فضّلوا دائمًا NOT EXISTS في حالة anti-join:

-- BUG-prone:
SELECT u.* FROM users u
WHERE u.id NOT IN (SELECT excluded_id FROM blocklist);

-- Safe:
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM blocklist b WHERE b.excluded_id = u.id);

الاستعلامات الفرعية المرتبطة في SELECT

نمط «البحث عن قيمة لكل صف»:

SELECT u.id, u.email,
  (SELECT MAX(created_at) FROM orders o WHERE o.user_id = u.id) AS last_order_at
FROM users u;

-- Often readable, but consider a LEFT JOIN + GROUP BY.

الاستعلامات الفرعية المرتبطة في UPDATE

استخرجوا قيمة مشتقة لكل صف:

UPDATE products p
SET review_count = (
  SELECT COUNT(*) FROM reviews r WHERE r.product_id = p.id
);

‏LATERAL JOIN: نمط مرتبط أوضح

عند الحاجة إلى «البحث عن بعض الصفوف لكل صف خارجي»، تكون LATERAL غالبًا أوضح وأسرع — وسيُشرح ذلك في درس أنماط JOIN المتقدمة.

التخزين المؤقت للاستعلامات الفرعية

لا تخزّن PostgreSQL نتائج الاستعلامات الفرعية مؤقتًا بين الصفوف افتراضيًا. وإذا احتجتم إلى النتيجة الداخلية نفسها مرات عديدة، فاستخدموا CTE.

فهرسة عمود الارتباط

يصفّي الاستعلام الفرعي الداخلي النتائج باستخدام مفتاح الصف الخارجي. ومن دون فهرس على ذلك المفتاح، ستحصلون على فحص كامل لكل صف خارجي.

-- For the orders example, this is essential:
CREATE INDEX orders_user_id_idx ON orders(user_id);

مراجعة

تشير الاستعلامات الفرعية المرتبطة إلى الصف الخارجي.

  • ‏EXISTS هو الشكل المرتبط المعتاد
  • فضّلوا NOT EXISTS على NOT IN
  • فهرسوا عمود الارتباط
  • تُعد LATERAL بديلًا أوضح في حالات كثيرة

تحقق سريع

لماذا يكون NOT EXISTS أكثر أمانًا من NOT IN عندما قد تحتوي المجموعة الداخلية على NULL؟

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

هل درس «الاستعلامات الفرعية المترابطة وغير المترابطة» مجاني؟

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

ماذا ستتعلم في «الاستعلامات الفرعية المترابطة وغير المترابطة»؟

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

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

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

كم من الوقت يستغرق درس «الاستعلامات الفرعية المترابطة وغير المترابطة»؟

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

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

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

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

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