قابِل بين بيانات جدولين باستخدام INNER JOIN، وأسماء مستعارة سهلة القراءة، وشرط ربط دقيق.
افتح هذا الدرس في Kodokonلا تخزّن أيّ قاعدة بيانات حقيقية كل شيء في جدول واحد: فالعملاء في جهة، وطلباتهم في جهة أخرى. ولممارسة هذا الفصل، افتح sqliteonline.com في متصفحك (دون الحاجة إلى أيّ تثبيت) أو شغّل أداة sqlite3 في الطرفية. الصق أولًا السكربت أدناه: فهو ينشئ الجدولين المستخدمين في هذا الدرس.
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
city TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL,
amount REAL NOT NULL,
ordered_at TEXT NOT NULL
);
INSERT INTO customers (id, name, city) VALUES
(1, 'Alice', 'Lyon'),
(2, 'Karim', 'Paris'),
(3, 'Mina', 'Nantes');
INSERT INTO orders
(id, customer_id, amount, ordered_at)
VALUES
(1, 1, 49.90, '2026-06-01'),
(2, 1, 15.00, '2026-06-12'),
(3, 2, 120.50, '2026-06-15');يجمع INNER JOIN جدولين صفًا صفًا وفق شرط تطابق يُكتب بعد ON. هنا، يرتبط كل طلب بالعميل الذي يساوي id الخاص به قيمة customer_id الخاصة به. وتُستبعد الصفوف التي لا تطابق لها من النتيجة: فمينا، التي لم تطلب شيئًا، لا تظهر.
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
ON customers.id = orders.customer_id;يصبح تكرار أسماء الجداول الكاملة غير قابل للقراءة بسرعة. إن الاسم المستعار المُصرَّح به باستخدام AS يعيد تسمية الجدول طوال مدة الاستعلام. اسبِق دائمًا الأعمدة الملتبسة ببادئة: فـ id موجود في كلا الجدولين، لذا اكتب c.id أو o.id، ولا تكتب أبدًا id وحده.
SELECT c.name, o.amount, o.ordered_at
FROM orders AS o
INNER JOIN customers AS c
ON c.id = o.customer_id
WHERE o.amount > 20
ORDER BY o.amount DESC;