الدرس 5 من 10
الاستعلام الفرعي
- 14 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
استعلام داخل استعلام
الشرح
الاستعلام الفرعي هو SELECT تكتبه بين قوسين داخل استعلام آخر، فيُنفَّذ أولًا ثم تُستعمل نتيجته كأنك كتبتها بنفسك.
فإن أرجع قيمة واحدة قارنت بها مثل price > (SELECT AVG(price) FROM products)، وبهذا لا تحتاج إلى معرفة المتوسّط مسبقًا، ولا إلى تعديله حين تتغيّر الأسعار. وإن أرجع عمودًا من القيم سألت هل القيمة موجودة بينها، مثل id IN (SELECT product_id FROM order_items).
قد يبدو لك أنّ JOIN مع order_items طريق أقصر، لكنه يكرّر المنتج مرّة لكل بند بيع فيه، أمّا IN فيسأل فقط هل المنتج موجود، فلا يكرّر شيئًا.
المطلوب
اعرض name وprice للمنتجات التي بيعت مرّة على الأقل وسعرها أعلى من متوسّط أسعار المنتجات كلها.
الفحوص
5 فحوص- العمودان name وprice
- كل المنتجات أغلى من المتوسّط
- كل المنتجات بيعت مرّة على الأقل
- يظهر كل منتج مرّة واحدة
- لم ينقص أيّ منتج يحقّق الشرط
الجداول المتاحة في هذا الدرس
CREATE TABLE customers ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, city TEXT NOT NULL ); CREATE TABLE orders ( id INTEGER PRIMARY KEY, customer_id INTEGER REFERENCES customers(id), total INTEGER NOT NULL, placed_on TEXT NOT NULL ); INSERT INTO customers (id, name, city) VALUES (1, 'ليان', 'الرياض'), (2, 'خالد', 'جدة'), (3, 'ريم', 'الدمام'), (4, 'فهد', 'الرياض'); INSERT INTO orders (customer_id, total, placed_on) VALUES (1, 120, '2026-09-01'), (1, 80, '2026-09-12'), (2, 300, '2026-09-03'), (3, 45, '2026-09-20'), (2, 60, '2026-09-25'); INSERT INTO customers (id, name, city) VALUES (5, 'سارة', 'جدة'); CREATE TABLE products ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, price INTEGER NOT NULL ); CREATE TABLE order_items ( id INTEGER PRIMARY KEY, order_id INTEGER REFERENCES orders(id), product_id INTEGER REFERENCES products(id), qty INTEGER NOT NULL ); INSERT INTO products (id, name, price) VALUES (1, 'دفتر', 15), (2, 'قلم', 5), (3, 'حقيبة', 90), (4, 'آلة حاسبة', 60), (5, 'مصباح', 100); INSERT INTO order_items (order_id, product_id, qty) VALUES (1, 3, 1), (1, 1, 2), (2, 4, 1), (2, 2, 4), (3, 3, 2), (3, 4, 2), (4, 1, 3), (5, 1, 2), (5, 2, 6);