NahdaAIنهضة
SQL Databases • المستوى الثالث • الدرس 4

الاستعلامات الفرعية والتجميع المتقاطع (Subqueries)

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

أهداف الدرس

  • كتابة الاستعلامات الفرعية المدمجة (Subqueries / Nested Queries).
  • استخدام IN و NOT IN مع نتائج الاستعلامات الفرعية.
  • دمج AVG() مع Subquery للفلترة حسب المتوسط العام.
  • استخراج بيانات شرطية معقدة عبر دمج المخرجات بين الجداول.

1. ما هي الاستعلامات الفرعية Subqueries؟

هي عبارة عن استعلام SQL داخلي يتم تضمينه بداخل عبارة WHERE أو FROM أو SELECT لاستخدام نتيجته كمدخل للشرط الرئيسي.

sql
-- Subquery في WHERE
SELECT name FROM users
WHERE id IN (
  SELECT user_id FROM orders WHERE total_amount > 100
);

-- Subquery مع AVG
SELECT * FROM orders
WHERE total_amount > (SELECT AVG(total_amount) FROM orders);

-- Subquery في FROM (Derived Table)
SELECT sub.user_id, sub.total
FROM (
  SELECT user_id, SUM(total_amount) AS total
  FROM orders
  GROUP BY user_id
) AS sub
WHERE sub.total > 500;

2. أنواع Subqueries

Scalar Subquery

يُرجع قيمة واحدة (رقم أو نص).

WHERE x > (SELECT AVG(y) FROM t)
Row Subquery

يُرجع صفاً واحداً بعدة أعمدة.

WHERE (a, b) = (SELECT x, y FROM t)
Table Subquery

يُرجع جدولاً كاملاً (يُستخدم في FROM).

FROM (SELECT ... FROM t) AS sub
Correlated Subquery

يعتمد على الصف الخارجي (نادر ومهم للأداء).

WHERE x = (SELECT ... WHERE t.id = u.id)

3. IN vs EXISTS vs NOT IN

الأداةالوظيفةمثال
INقيمة موجودة في قائمةid IN (SELECT ...)
NOT INقيمة غير موجودة في قائمةid NOT IN (SELECT ...)
EXISTSهل يوجد صف مطابق؟WHERE EXISTS (SELECT 1 ...)

ملاحظة: EXISTS أسرع عادةً من IN مع الجداول الكبيرة.

التطبيق العملي المباشر

تحدي الدرس الرابع: استعلامات فرعية متقدمة

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. احتفظ بالاستعلام الأصلي (Subquery مع AVG).
  2. أضف استعلاماً يجلب المستخدمين الذين لديهم طلبات بـ total_amount > 100 فقط.
  3. أضف استعلاماً يجلب الطلبات التي تتجاوز متوسط كل الطلبات (بدون Subquery للمستخدمين).
  4. أضف استعلاماً بـ NOT IN لجلب المستخدمين الذين ليس لديهم أي طلبات.
  5. أضف استعلاماً بـ GROUP BY مع SUM(total_amount) لمجموع طلبات كل مستخدم.
  6. اضغط "تشغيل الكود" لرؤية نتائج آخر استعلام.
⏳ جارٍ تحميل المحرر التفاعلي...