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

FULL JOIN: نگه‌داشتن ردیف‌های بدون تطبیق از هر دو سمت

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

حالا که LEFT JOIN و RIGHT JOIN را دیدیم، سوال طبیعی این است: اگر بخواهیم هم دانش‌آموزان بدون ثبت‌نام (مثل فاطمه) و هم درس‌های بدون دانش‌آموز (مثل هنر) را هم‌زمان در یک نتیجه ببینیم چه؟ دقیقاً همین کاری است که FULL JOIN (یا FULL OUTER JOIN) انجام می‌دهد.

ساختار پایه

sql
SELECT s.full_name, c.title
FROM students s
FULL JOIN enrollments e ON s.id = e.student_id
FULL JOIN courses c ON e.course_id = c.id;

FULL JOIN می‌توان آن را ترکیب LEFT JOIN و RIGHT JOIN در نظر گرفت: هم ردیف‌های بدون تطبیق سمت چپ نگه داشته می‌شوند، هم ردیف‌های بدون تطبیق سمت راست — و برای هرکدام، ستون‌های طرف مقابل NULL می‌شوند. بیا ببینیم:

امتحانش کن — FULL JOIN
هم «فاطمه کریمی» (با title = NULL) و هم «هنر» (با full_name = NULL) هم‌زمان در نتیجه هستند — چون FULL JOIN از هیچ‌کدام از دو طرف چیزی را کنار نمی‌گذارد.

پیدا کردن ردیف‌های «فقط ناهماهنگ» از هر دو طرف

الگوی LEFT JOIN + IS NULL که در درس LEFT JOIN دیدیم، با FULL JOIN هم قابل تعمیم است — برای پیدا کردن همه‌ی ناهماهنگی‌ها از هر دو سمت هم‌زمان:

sql
SELECT s.full_name, c.title
FROM students s
FULL JOIN enrollments e ON s.id = e.student_id
FULL JOIN courses c ON e.course_id = c.id
WHERE s.id IS NULL OR c.id IS NULL;

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

امتحانش کن — فقط ناهماهنگی‌ها از هر دو طرف

نکته‌ی مهم درباره‌ی پشتیبانی موتورها

توجه: FULL JOIN در SQL Server همیشه پشتیبانی شده، و در نسخه‌های نسبتاً جدید SQLite (که Playground این سایت هم از آن‌ها استفاده می‌کند) هم پشتیبانی می‌شود. اما MySQL تا امروز اصلاً از FULL JOIN پشتیبانی نمی‌کند! اگر روزی با MySQL کار کردی و به همین قابلیت نیاز داشتی، باید آن را با ترکیب UNION از یک LEFT JOIN و یک RIGHT JOIN شبیه‌سازی کنی — موضوعی که در فصل ۵ (پرس‌وجوهای پیشرفته) با UNION بیشتر آشنا می‌شویم.

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

  • FULL JOIN همه‌ی ردیف‌های هر دو جدول را نگه می‌دارد، چه تطبیق داشته باشند چه نه.
  • ردیف‌های بدون تطبیق از هر طرف، ستون‌های طرف مقابل را NULL می‌گیرند.
  • FULL JOIN ... WHERE a.id IS NULL OR b.id IS NULL همه‌ی ناهماهنگی‌های دوطرفه را نشان می‌دهد.
  • MySQL از FULL JOIN پشتیبانی نمی‌کند؛ SQL Server و نسخه‌های جدید SQLite پشتیبانی می‌کنند.

در آخرین درس این فصل، سراغ SELF JOIN می‌رویم: چطور یک جدول را به خودش JOIN بزنیم — مفید برای رابطه‌های سلسله‌مراتبی مثل «کارمند و مدیرش».