الدرس 4 من 10

ربط ثلاثة جداول

هدف الدرس

جملتا JOIN متتاليتان

01

الشرح

قد يحتوي الطلب الواحد على عدّة منتجات، وقد يُباع المنتج الواحد في عدّة طلبات، وهذه العلاقة تسمّى علاقة متعدّد إلى متعدّد (many-to-many)، وتُحفظ في جدول وسيط، فكل صفّ في order_items بند واحد فيه order_id وproduct_id والكمية qty.

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

والعمود id موجود في الجداول الثلاثة، فإذا كتبته دون اسم جدوله توقّف الاستعلام بالخطأ ambiguous column name، ولذلك اكتب اسم الجدول قبل كل عمود، وأعطِ الأعمدة المتشابهة أسماء مختلفة بـAS مثل products.name AS product.

02

المطلوب

اعرض لكل بند placed_on من جدول الطلبات، واسم المنتج في عمود اسمه product، والكمية qty، ورتّب النتيجة بالتاريخ.

الفحوص

5 فحوص
  1. الأعمدة placed_on وproduct وqty
  2. صفّ لكل بند
  3. العمود product اسم وليس رقمًا
  4. كل بند بتاريخه ومنتجه وكميته
  5. مرتّبة بالتاريخ
الجداول المتاحة في هذا الدرس
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);
query.sql
المخرجاتSQLite (sql.js)

نحمّل بيئة SQLite الآن.

–/5

يبدأ الفحص حين تجهز البيئة.

تجد 5 فحوص في بطاقة «المطلوب».