الدرس 2 من 10

الربط اليساري

هدف الدرس

الربط بـ LEFT JOIN والفحص بـ IS NULL

01

الشرح

يُبقي LEFT JOIN كل صفوف الجدول الأيسر، وهو الجدول المذكور بعد FROM، سواء كان لها مطابق في الجدول الأيمن أم لم يكن، وإذا لم يوجد مطابق جاءت أعمدة الجدول الأيمن كلها NULL.

وبهذا تجيب عن سؤال لا يستطيع INNER JOIN أن يجيب عنه، وهو: من الذي لم يطلب شيئًا؟ فتربط العملاء بالطلبات، ثم تُبقي الصفوف التي جاء جانبها الأيمن فارغًا: WHERE orders.id IS NULL.

ولا تكتب = NULL، لأنّ NULL تعني غياب القيمة وليست قيمة، ومقارنتها بأيّ شيء لا تكون صحيحة أبدًا، فيرجع الاستعلام فارغًا دون أيّ رسالة خطأ تنبّهك.

02

المطلوب

اعرض name وcity للعملاء الذين لم يطلبوا شيئًا بعد.

الفحوص

4 فحوص
  1. العمودان name وcity
  2. ظهر كل عميل ليس له طلبات
  3. لم يظهر أيّ عميل له طلب
  4. يظهر كل عميل مرّة واحدة
الجداول المتاحة في هذا الدرس
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 الآن.

–/4

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

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