FULL JOIN: نگهداشتن ردیفهای بدون تطبیق از هر دو سمت
حالا که LEFT JOIN و RIGHT JOIN را دیدیم، سوال طبیعی این است: اگر بخواهیم هم دانشآموزان بدون ثبتنام (مثل فاطمه) و هم درسهای بدون دانشآموز (مثل هنر) را همزمان در یک نتیجه ببینیم چه؟ دقیقاً همین کاری است که FULL JOIN (یا FULL OUTER JOIN) انجام میدهد.
ساختار پایه
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 میشوند. بیا ببینیم:
title = NULL) و هم «هنر» (با full_name = NULL) همزمان در نتیجه هستند — چون FULL JOIN از هیچکدام از دو طرف چیزی را کنار نمیگذارد.پیدا کردن ردیفهای «فقط ناهماهنگ» از هر دو طرف
الگوی LEFT JOIN + IS NULL که در درس LEFT JOIN دیدیم، با FULL JOIN هم قابل تعمیم است — برای پیدا کردن همهی ناهماهنگیها از هر دو سمت همزمان:
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 بزنیم — مفید برای رابطههای سلسلهمراتبی مثل «کارمند و مدیرش».