В чем ключевое различие между INNER JOIN и FULL [OUTER] JOIN в SQL?

«В чем ключевое различие между INNER JOIN и FULL [OUTER] JOIN в SQL?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое различие — в наборе строк, которые возвращает каждый из этих операторов соединения таблиц.

  • 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.