شرح SQL JOIN مع أمثلة (Inner وLeft وRight وFull)
تعلّم عمليات الربط INNER وLEFT وRIGHT وFULL وCROSS وSELF بجدولين صغيرين واستعلامات واضحة والنتائج الدقيقة المتوقعة.
- INNER JOIN: الصفوف المتطابقة في الجدولين فقط.
- LEFT JOIN: كل صفوف الجدول الأيسر مع المتطابقة (وNULL إن لم يوجد تطابق).
- RIGHT JOIN: كل صفوف الجدول الأيمن مع المتطابقة.
- FULL JOIN: كل صفوف الجدولين مع المطابقة حيثما أمكن.
- اربط عبر المفاتيح، واستخدم أسماء مستعارة للجداول، وأنشئ فهارس لأعمدة الربط.
لا تخزّن قواعد البيانات الحقيقية كل شيء في جدول واحد. العملاء في جدول والطلبات في جدول آخر. وللإجابة عن سؤال «أي العملاء قدّموا طلبات هذا الشهر؟» يجب الجمع بينهما، وهذا ما تفعله عمليات SQL JOIN.
هذا الدليل عملي. تُربك عمليات الربط كثيراً من المبتدئين لأن الجدولين نفسيهما يعطيان نتائج مختلفة بحسب نوع الربط. وعندما تراها ببيانات صغيرة ملموسة تصبح سهلة.
شرح SQL JOIN: الجداول النموذجية
customers
| id | name |
|---|---|
| 1 | Asha |
| 2 | Ben |
| 3 | Chitra |
orders
| id | customer_id | total |
|---|---|---|
| 101 | 1 | 250 |
| 102 | 1 | 120 |
| 103 | 2 | 90 |
| 104 | 9 | 40 |
لا طلبات لدى Chitra، والطلب 104 يشير إلى عميل (9) غير موجود. هاتان الحالتان الحديتان توضحان الفرق بين أنواع الربط.
INNER JOIN
يعيد INNER JOIN الصفوف التي يتحقق فيها الشرط في الجدولين فقط، وتُستبعد الصفوف التي لا نظير لها.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;
النتيجة: Asha (101) وAsha (102) وBen (103). تغيب Chitra والطلب 104. استخدمه عندما تهتم بالبيانات المترابطة فقط، مثل الطلبات مع بيانات عملائها. كتابة JOIN وحدها تعني INNER JOIN.
LEFT JOIN
يحتفظ LEFT JOIN بكل صفوف الجدول الأيسر ويضيف الصفوف المتطابقة من الأيمن. وحيث لا يوجد تطابق تكون أعمدة الجدول الأيمن NULL.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
النتيجة: Asha (101) وAsha (102) وBen (103) وChitra (NULL, NULL). تظهر Chitra الآن.
نصيحة سريعة: للعثور على العملاء الذين لم يطلبوا أبداً، صفِّ بحسب NULL في الجانب الأيمن: WHERE o.id IS NULL يعيد Chitra. يستخدمه المختبرون لإيجاد السجلات اليتيمة أو المفقودة.
RIGHT JOIN وFULL JOIN
RIGHT JOIN مرآة LEFT JOIN ويحتفظ بكل صفوف الجدول الأيمن. يفضّل معظم الناس تبديل ترتيب الجدولين واستخدام LEFT JOIN لأنه أطبع في القراءة.
SELECT c.name, o.id AS order_id
FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;
تتضمن النتيجة الطلب 104 مع اسم عميل NULL. أما FULL (OUTER) JOIN فيعيد كل صفوف الجدولين: Chitra بلا طلب والطلب 104 بلا عميل.
SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id;
يدعمه PostgreSQL وSQL Server. أما MySQL فلا يدعمه، لذا اجمع LEFT JOIN وRIGHT JOIN باستخدام UNION. وللمزيد، يتضمن دليل PostgreSQL درساً واضحاً عن الربط.
| الربط | صفوف الأيسر فقط | صفوف الأيمن فقط | المتطابقة |
|---|---|---|---|
| INNER | لا | لا | نعم |
| LEFT | نعم | لا | نعم |
| RIGHT | لا | نعم | نعم |
| FULL | نعم | نعم | نعم |
CROSS JOIN وSELF JOIN
يقرن CROSS JOIN كل صف من جدول بكل صف من الجدول الآخر: ثلاثة عملاء وأربعة طلبات تعطي اثني عشر صفاً. نادراً ما يُستخدم، لكنه مفيد لتوليد التركيبات، مثل بيانات اختبار لكل مقاس ولون.
SELECT c.name, o.id
FROM customers c
CROSS JOIN orders o;
يربط SELF JOIN الجدول بنفسه عبر أسماء مستعارة، مثلاً لإيجاد مدير كل موظف.
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
SQL JOIN: الأخطاء الشائعة ونصائح الأداء
- نسيان شرط ON ينشئ CROSS JOIN عن غير قصد ويضخّم عدد الصفوف.
- التصفية على الجدول الأيمن في WHERE بعد LEFT JOIN تحوّله إلى INNER JOIN؛ ضع الشرط في ON.
- أسماء أعمدة ملتبسة: ابدأ الأعمدة بالاسم المستعار للجدول.
- الربط على أعمدة غير فريدة يضاعف الصفوف ويضخّم المجاميع.
- أنشئ فهارس لأعمدة الربط، واختر الأعمدة اللازمة فقط، وافحص الاستعلامات البطيئة بـ
EXPLAIN.
لماذا تهم عمليات الربط المختبرين
يستخدم مهندسو الجودة عمليات الربط للتحقق من أن البيانات المُنشأة عبر الواجهة أو API وصلت إلى قاعدة البيانات بشكل صحيح، وللعثور على السجلات اليتيمة. اقرأ معها دليل اختبار API باستخدام Postman (بالإنجليزية). وللأساسيات راجع دليل SQL للمبتدئين (بالإنجليزية)، وللمخازن الحديثة اقرأ عن قواعد البيانات المتجهية (بالإنجليزية). ولتشغيل قاعدة بيانات محلياً راجع دليل Docker (بالإنجليزية).
الخلاصة
SQL JOIN في سطر واحد: INNER يبقي المتطابق فقط، وLEFT يبقي كل ما في اليسار، وRIGHT كل ما في اليمين، وFULL يبقي الجميع. تدرّب بجدولين صغيرين حتى تتوقع النتيجة قبل تشغيل الاستعلام، ثم جرّب ربط ثلاثة جداول والجمع بين الربط وGROUP BY.
الأسئلة الشائعة
ما الفرق بين INNER JOIN وLEFT JOIN؟
يعيد INNER JOIN الصفوف المتطابقة في الجدولين فقط. ويعيد LEFT JOIN كل صفوف الجدول الأيسر ويملأ أعمدة الأيمن غير المتطابقة بـ NULL.
أي نوع من SQL JOIN هو الأسرع؟
لا يوجد نوع هو الأسرع دائماً. يعتمد الأداء على الفهارس وحجم الجداول وخطة الاستعلام. أنشئ فهارس لأعمدة الربط وافحص خطة التنفيذ.
هل يدعم MySQL الأمر FULL OUTER JOIN؟
لا. في MySQL اجمع LEFT JOIN وRIGHT JOIN باستخدام UNION للحصول على النتيجة نفسها.
ما فائدة SELF JOIN؟
يقارن SELF JOIN صفوفاً من الجدول نفسه، مثل إيجاد مدير كل موظف في جدول employees واحد.
لماذا يعيد الربط صفوفاً مكررة؟
تظهر التكرارات عادةً عندما لا يكون عمود الربط فريداً في أحد الجدولين. افحص مفاتيحك أو اجمع البيانات قبل الربط.
تابع التعلّم (مقالات بالإنجليزية)
هل تحتاج مساعدة في الاختبار أو WordPress أو SEO؟
نساعد الفرق على إطلاق برمجيات أفضل وتنمية مواقعها. أخبرنا بما تعمل عليه وسنقترح خطوة تالية واضحة.
المزيد من الأدلة على الاختبار والذكاء الاصطناعي والتطوير الحديث
استمتعت بهذا المقال؟ اختر موضوعًا وانتقل مباشرةً إلى أحدث برامجنا التعليمية.
