Kodokon kodokon.com

INNER JOIN: ربط جدولين

قابِل بين بيانات جدولين باستخدام INNER JOIN، وأسماء مستعارة سهلة القراءة، وشرط ربط دقيق.

7 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

لا تخزّن أيّ قاعدة بيانات حقيقية كل شيء في جدول واحد: فالعملاء في جهة، وطلباتهم في جهة أخرى. ولممارسة هذا الفصل، افتح sqliteonline.com في متصفحك (دون الحاجة إلى أيّ تثبيت) أو شغّل أداة sqlite3 في الطرفية. الصق أولًا السكربت أدناه: فهو ينشئ الجدولين المستخدمين في هذا الدرس.

SQL
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 الخاصة به. وتُستبعد الصفوف التي لا تطابق لها من النتيجة: فمينا، التي لم تطلب شيئًا، لا تظهر.

SQL
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
  ON customers.id = orders.customer_id;
كل طلب مع اسم عميله.

يصبح تكرار أسماء الجداول الكاملة غير قابل للقراءة بسرعة. إن الاسم المستعار المُصرَّح به باستخدام AS يعيد تسمية الجدول طوال مدة الاستعلام. اسبِق دائمًا الأعمدة الملتبسة ببادئة: فـ id موجود في كلا الجدولين، لذا اكتب c.id أو o.id، ولا تكتب أبدًا id وحده.

SQL
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;
أسماء مستعارة قصيرة، وتصفية، وترتيب: استعلام احترافي نموذجي.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. في عملية ربط، أيّ كلمة مفتاحية تُقدِّم شرط التطابق بين الجدولين؟
    • WHERE
    • ON
    • HAVING
    • MATCH
  2. مع INNER JOIN بين customers وorders، ماذا يحدث لعميل ليس له أيّ طلب؟
    • يظهر مع أعمدة قيمتها NULL
    • يغيب عن النتيجة
    • يفشل الاستعلام
  3. لماذا نكتب c.id بدلًا من id في استعلام يربط customers وorders؟
    • لتسريع تنفيذ الاستعلام
    • لأن id موجود في كلا الجدولين ويكون ملتبسًا
    • لأن SQLite تتطلب ذلك لكل عمود