Ответ
Ключевое различие — в наборе строк, которые возвращает каждый из этих операторов соединения таблиц.
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.