sql JOIN : الربط بين الجداول

INNER JOIN : الرّبط الدّاخلي

آخر تحيين: 13-04-2014

LEFT/RIGH/ JOIN : الرّبط الخارجي php MySQL إنشاء مُدوّنة


JOIN : تعليمة مهمة ، لا غنى عنها ، من تعليمات لغة SQL . تُتيح لنا ضم بيانات جدولين أو أكثر أثناء الإستعلام . و بطبيعة الحال ، يجب أن تكون الجداول مُرتبطة بينها بمفاتيح خارجية .
تتنوع طرق استعمال SQL JOIN حسب حاجتنا . سنتعرّف ، و نُجلي الغموض ، على الأكثر شعبية ، عبر أمثلة تطبيقية . لهذا ، قبل الإستمرار . سنُنشيء جدولين مُرتبطين ، حتّى تتمكّنوا من فهم صحيح لما يجري :
1 ـ authors : جدول يضمّ أسماء المُؤلّفين
2 ـ books : جدول يضم أسماء الكُتب الّتي ألّفها كل مؤلّف
سأعطيكم حالاً ، الشيفرات لإنشاء الجدولين ، ثم سنرى طرق الإستعلام المختلفة لضمّهما .
قمت بملأ الجدولين ببعض البيانات ، حتّى أعفيكم من ذلك

  • جدول authors
    CREATE TABLE IF NOT EXISTS `authors` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `author_name` varchar(70) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
    
    INSERT INTO `authors` (`id`, `author_name`) VALUES
    (1, 'زيد'),
    (2, 'ليلى'),
    (3, 'عمر'),
    (4, 'قيس');
  • جدول books
    CREATE TABLE IF NOT EXISTS `books` (
      `book_id` int(11) NOT NULL AUTO_INCREMENT,
      `author_id` int(11) NOT NULL,
      `book_name` varchar(70) NOT NULL,
      PRIMARY KEY (`book_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
    
    INSERT INTO `books` (`book_id`, `author_id`, `book_name`) VALUES
    (1, 2, 'كتاب الصحة'),
    (2, 3, 'الكتاب الأخضر'),
    (3, 3, 'الكتاب الأصفر'),
    (4, 1, 'الكتاب الأصفر'),
    (5, 0, 'كتاب الفضاء');

سأضع أمام أعينكم الجدولين جنباً لجنب : جدول authors على اليسار، و جدول books على اليمين.
ـ جدول authors يضم أسماء 4 مؤلّفين .
ـ جدول books يضم 4 كتب .
الكاتب "زيد" ألّف "الكتاب الأصفر" . نلاحظ بأن "زيد" و "عمر" ، إشتركا في تأليف هذا الكتاب . كما أن لعَمْر كتاباً آخر هو "الكتاب الأخضر" .
ليلى ألّفت "كتاب الصحة".
أمّا "قيس" فلم يتوصّل لتأليف أي كتاب حاليا . كما نلاحظ أن "كتاب الفضاء" ليس لديه أي مؤلف .

books
book_idauthor_idbook_name
12كتاب الصحة
23الكتاب الأخضر
33الكتاب الأصفر
41الكتاب الأصفر
50كتاب الفضاء
...
authors
idauthor_name
1زيد
2ليلى
3عمر
4قيس

سنرى بعض طرق ضم الجدولين أثناء الإستعلام و الإختلاف بينها :

  • INNER JOIN : تعطينا الإدخالات المتطابقة في الجدولين .
  • LEFT JOIN : تعطينا جميع إدخالات الجدول الموجود على اليسار "authors" ، زائد الإدخالات المتطابقة فقط في الجدول على اليمين
  • RIGHT JOIN : تعطينا جميع إدخالات الجدول الموجود على اليمين "books" ، زائد الإدخالات المتطابقة فقط في الجدول على اليسار
  • FULL JOIN : تعطينا جميع إدخالات الجدولين ، أثناء وجود و لو نتيجة واحدة متطابقة

حسب البيانات التي تريدون الحصول عليها ، سنرى جميع الحالات باستعمال هذه الطّرق .

INNER JOIN

إذا أردنا الحصول على البيانات المتطابقة فقط ، في الجدولين . سنستعمل INNER JOIN .
يمكننا أيضا استبدال INNER JOIN بالتعليمة JOIN أو CROSS JOIN : هذه التعليمات الثلاث ، تُعطينا نفس النتيجة .

SELECT author_name, book_name 
FROM authors
INNER JOIN books 
ON id = author_id

شرح الإستعلام :
قمنا باختيار البيانات من الجدولين ، كما تلاحظون : حقل author_name ينتمي إلى الجدول authors . و book_name ينتمي إلى الجدول الثاني . ثم قمنا بربط الجدولين باستعمال INNER JOIN . بعدها بيّنّا الحقلين اللذين سيربطان الجدولين :ON id = author_id أي ربط حقل المفتاح الأساسي "id" لجدول authors بمفتاحه الخارجي author_id الموجود في جدول books .

نتيجة الإستعلام :

نتيجة ضم الجدولين باستعمال INNER JOIN
author_namebook_name
زيدالكتاب الأصفر
ليلىكتاب الصحة
عمرالكتاب الأخضر
عمرالكتاب الأصفر

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

أثناء ضم جدولين أو أكثر في الإستعلام ، يجب ربط كل حقل بجدوله . إستعلامنا السابق صحيح في مثالنا ، لكن بمجرّد أن يكون لديكم حقول تحمل نفس الإسم في جداول مُختلفة . فلن تحصلوا على أيّ نتيجة . لتفادي هذا ، إعتادوا دائما تعيين الجدول الذي ينتمي إليه الحقل . لتفعيل ذلك : نكتب إسم الجدول و الحقل و نفصل بينهما بنقطة ، مثال : authors.author_name
سيصبح استعلامنا كالتالي :
SELECT authors.author_name, books.book_name 
FROM authors
INNER JOIN books 
ON authors.id = books.author_id
لكي لا يكون هناك خلط أثناء عرض محتوى الحقول ذات الأسماء المتشابهة . و أيضاً لإعطاء الحقول أسماء واضحة أو مُختزلة . يمكننا استعمال الأسماء الخيالية باستخدام التعليمة "As" :
SELECT authors.author_name AS alkatib, books.book_name AS kitab
FROM authors
INNER JOIN books 
ON authors.id = books.author_id
النتيجة
alkatibkitab
زيدالكتاب الأصفر
ليلىكتاب الصحة
عمرالكتاب الأخضر
عمرالكتاب الأصفر
يمكننا إعطاء الأسماء الخيالية للجداول أيضا ، من باب اختزال أسمائها .
SELECT a.author_name AS alkatib, b.book_name AS kitab
FROM authors a
INNER JOIN books b
ON a.id = b.author_id

أصبحت الآن شيفرتنا أكثر تنظيماً و وُضوحا .

يمكنكم أيضا إستعمال التعليمة WHERE و ORDER BY ...إلخ . لتحديد استعلامكم كما رأينا سابقا . و جميع العوامل الأخرى : "<" , ">" , "<>", ... إلخ
نفس المبدأ ينطبق على تعليمات JOIN المتبقية : LEFT JOIN , RIGHT JOIN, FULL JOIN ... لنتعرّف عليها في الدّرس التالي