خانه/ ارتباطات و JOINها/ INNER JOIN

INNER JOIN: ترکیب داده‌ی جدول‌های مرتبط

مبتدی ۱۴ دقیقه مطالعه

در این فصل، از سه جدول مرتبط استفاده می‌کنیم که در همه‌ی درس‌های بعدی هم می‌بینیمشان:

جدولمحتوا
studentsعلی، زهرا، محمد، فاطمه (در هیچ درسی ثبت‌نام نکرده)
coursesریاضی، فیزیک، هنر (هیچ دانش‌آموزی ندارد)
enrollmentsارتباط بین دانش‌آموز و درس، از طریق student_id و course_id

این دو مورد پررنگ‌شده عمداً این‌طور طراحی شده‌اند — چون دقیقاً همین «ناهماهنگی‌ها»ست که تفاوت انواع JOIN را روشن می‌کند.

چرا اصلاً به JOIN نیاز داریم؟

اطلاعات دانش‌آموز در یک جدول است، اطلاعات درس در جدول دیگر. اگر بخواهیم بدانیم «کدام دانش‌آموز در کدام درس ثبت‌نام کرده»، باید این سه جدول را در یک پرس‌وجو به‌هم وصل کنیم. JOIN دقیقاً همین کار را می‌کند.

ساختار پایه INNER JOIN

sql
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 JOIN سه‌جدولی
دقت کن نه «فاطمه کریمی» در نتیجه هست، نه «هنر» — چون هیچ‌کدام تطبیقی در طرف مقابل ندارند. این دقیقاً معنای INNER است: فقط تقاطع دو مجموعه.

نام مستعار جدول‌ها (Table Alias) برای خوانایی بیشتر

وقتی چند جدول با هم JOIN می‌شوند، تکرار نام کامل هر جدول خسته‌کننده می‌شود. با نام مستعار (مثل ستون‌ها) می‌توان کد را کوتاه‌تر و خواناتر کرد:

sql
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 ضمنی با کاما (توصیه نمی‌شود)

ممکن است در کدهای قدیمی این سبک را ببینی:

sql
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، مثل همیشه فیلتر هم اضافه کرد:

sql
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'ریاضی';

بیا این را امتحان کنیم:

امتحانش کن — JOIN با نام مستعار و WHERE

جمع‌بندی این درس

  • INNER JOIN فقط ردیف‌هایی را برمی‌گرداند که در هر دو طرف تطبیق دارند.
  • می‌توان چند INNER JOIN را زنجیره کرد تا چند جدول با هم ترکیب شوند.
  • نام مستعار جدول‌ها (students AS s) خوانایی JOINهای پیچیده را بهتر می‌کند.
  • سبک قدیمی JOIN با کاما و WHERE، همان کار را می‌کند اما توصیه نمی‌شود.

در درس بعدی سراغ LEFT JOIN می‌رویم: چطور دانش‌آموزانی مثل فاطمه را هم — حتی بدون ثبت‌نام — در نتیجه نگه داریم.