INNER JOIN: ترکیب دادهی جدولهای مرتبط
در این فصل، از سه جدول مرتبط استفاده میکنیم که در همهی درسهای بعدی هم میبینیمشان:
| جدول | محتوا |
|---|---|
students | علی، زهرا، محمد، فاطمه (در هیچ درسی ثبتنام نکرده) |
courses | ریاضی، فیزیک، هنر (هیچ دانشآموزی ندارد) |
enrollments | ارتباط بین دانشآموز و درس، از طریق student_id و course_id |
این دو مورد پررنگشده عمداً اینطور طراحی شدهاند — چون دقیقاً همین «ناهماهنگیها»ست که تفاوت انواع JOIN را روشن میکند.
چرا اصلاً به JOIN نیاز داریم؟
اطلاعات دانشآموز در یک جدول است، اطلاعات درس در جدول دیگر. اگر بخواهیم بدانیم «کدام دانشآموز در کدام درس ثبتنام کرده»، باید این سه جدول را در یک پرسوجو بههم وصل کنیم. JOIN دقیقاً همین کار را میکند.
ساختار پایه INNER JOIN
SELECT students.full_name, courses.title FROM students INNER JOIN enrollments ON students.id = enrollments.student_id INNER JOIN courses ON enrollments.course_id = courses.id;
INNER JOIN فقط ردیفهایی را برمیگرداند که در هر دو جدول طرف مقایسه، تطبیق داشته باشند. اگر دانشآموزی هیچ ثبتنامی نداشته باشد (مثل فاطمه)، یا درسی هیچ دانشآموزی نداشته باشد (مثل هنر)، هیچکدام در نتیجه ظاهر نمیشوند. بیا ببینیم:
INNER است: فقط تقاطع دو مجموعه.نام مستعار جدولها (Table Alias) برای خوانایی بیشتر
وقتی چند جدول با هم JOIN میشوند، تکرار نام کامل هر جدول خستهکننده میشود. با نام مستعار (مثل ستونها) میتوان کد را کوتاهتر و خواناتر کرد:
SELECT s.full_name, c.title FROM students AS s INNER JOIN enrollments AS e ON s.id = e.student_id INNER JOIN courses AS c ON e.course_id = c.id;
کلمهی AS اینجا هم اختیاری است (میتوان فقط students s نوشت)، اما نوشتنش صراحت بیشتری میدهد.
روش قدیمی: JOIN ضمنی با کاما (توصیه نمیشود)
ممکن است در کدهای قدیمی این سبک را ببینی:
SELECT s.full_name, c.title FROM students s, enrollments e, courses c WHERE s.id = e.student_id AND e.course_id = c.id;
INNER JOIN صریح را میدهد، اما از آن پرهیز کن. با این سبک، شرطهای JOIN و شرطهای فیلترکنندهی معمولی همه در WHERE قاطی میشوند و خواندن کد سختتر میشود؛ فراموشکردن حتی یکی از شرطهای اتصال هم بهراحتی ممکن است و باعث نتیجهی اشتباه میشود.افزودن WHERE بعد از JOIN
میتوان بعد از JOIN، مثل همیشه فیلتر هم اضافه کرد:
SELECT s.full_name, c.title FROM students s INNER JOIN enrollments e ON s.id = e.student_id INNER JOIN courses c ON e.course_id = c.id WHERE c.title = N'ریاضی';
بیا این را امتحان کنیم:
جمعبندی این درس
INNER JOINفقط ردیفهایی را برمیگرداند که در هر دو طرف تطبیق دارند.- میتوان چند
INNER JOINرا زنجیره کرد تا چند جدول با هم ترکیب شوند. - نام مستعار جدولها (
students AS s) خوانایی JOINهای پیچیده را بهتر میکند. - سبک قدیمی JOIN با کاما و WHERE، همان کار را میکند اما توصیه نمیشود.
در درس بعدی سراغ LEFT JOIN میرویم: چطور دانشآموزانی مثل فاطمه را هم — حتی بدون ثبتنام — در نتیجه نگه داریم.