Ответ
Ключевое различие — в наборе строк, которые возвращает каждый из этих операторов соединения таблиц.
INNER JOINвозвращает только те строки, для которых условие соединения (ON) выполняется в обеих таблицах (пересечение множеств).FULL [OUTER] JOINвозвращает все строки из обеих таблиц. Для строк, не имеющих соответствия в другой таблице, недостающие столбцы заполняются значениямиNULL(объединение множеств).
Визуализация:
Таблица A: Таблица B: INNER JOIN (A ∩ B): FULL JOIN (A ∪ B):
+----+------+ +----+-------+ +----+------+-------+ +----+------+-------+
| id | val | | id | value | | A.id | A.val | B.value | | A.id | A.val | B.value |
+----+------+ +----+-------+ +------+-------+--------+ +------+-------+---------+
| 1 | a | | 2 | x | | 2 | b | x | | 1 | a | NULL |
| 2 | b | | 3 | y | | 3 | c | y | | 2 | b | x |
| 3 | c | | 4 | z | +------+-------+--------+ | 3 | c | y |
+----+------+ +----+-------+ | NULL | NULL | z |
+------+-------+---------+
Пример SQL-запросов:
-- INNER JOIN: Только общие записи (id 2 и 3)
SELECT a.id, a.val, b.value
FROM table_a a
INNER JOIN table_b b ON a.id = b.id;
-- FULL OUTER JOIN: Все записи из A и B (id 1,2,3,4)
SELECT a.id, a.val, b.value
FROM table_a a
FULL OUTER JOIN table_b b ON a.id = b.id;
-- Ключевое слово OUTER часто опускают: FULL JOIN
Практическое следствие: FULL JOIN обычно менее производителен, чем INNER JOIN, особенно на больших таблицах, так как требует обработки и объединения всех строк, включая несовпадающие, с подстановкой NULL.
Ответ 18+ 🔞
А, ну вот, опять про эти ваши джойны! Слушай, давай я тебе на пальцах объясню, а то ты, я смотрю, уже глазами хлопаешь, как сова нахуй.
Представь себе две толпы людей на площади. Одна толпа — это таблица А, другая — таблица Б. У каждого в руках бумажка с номером, это id.
Так вот, INNER JOIN — это как если бы пришёл какой-то охуевший менеджер и заорал: «Так, блядь! Все, у кого есть пара с таким же номером из другой толпы — шаг вперёд, в центр! Остальные — нахуй отсюда!». И в центре остаются только парочки, которые нашли друг друга. Одинокие чуваки с обоих сторон идут лесом. Это и есть пересечение, ёпта.
А FULL JOIN — это полный пиздец и бардак. Это когда тот же менеджер, но уже под мухой, орёт: «ВСЕ СЮДА, НАХУЙ! И из толпы А, и из толпы Б! Кто нашёл пару — встаньте рядом. Кто одинокий — тоже иди сюда, но стой один, а на месте пропавшей половинки мы тебе табличку „НИХУЯ“ прилепим!». И вот ты получаешь ВСЕХ. И пары, и одиноких парней из А, и одиноких девушек из Б. А вместо недостающей половинки — NULL, то есть наша табличка «НИХУЯ».
На картинке это, блядь, вообще элементарно:
Таблица A (Мужики): Таблица B (Девушки):
id | Имя id | Имя
1 | Вася 2 | Маша
2 | Петя 3 | Даша
3 | Коля 4 | Света
INNER JOIN (Только пары, которые сошлись):
Получили Петю (id2) с Машей (id2) и Колю (id3) с Дашей (id3).
Вася и Света — нахуй, у них пары нет.
FULL JOIN (Всех согнали в кучу):
Вася (id1) стоит один, рядом с ним табличка NULL вместо девушки.
Петя с Машей — молодцы.
Коля с Дашей — красавцы.
А Света (id4) стоит одна, и вместо мужика у неё NULL.
И да, FULL JOIN — это всегда овердохуища работы для базы. Ей же надо всех перебрать, всех соединить, всем одиночкам NULL подставить. INNER JOIN обычно шустрее, потому что лишний мусор сразу отсекает.
Код твой я не трогаю, он правильный. Просто запомни: INNER — только пары, FULL — все до единого, но с риском получить NULL в объятиях. Всё, вопрос исчерпан, можно идти пить чай.