INNER JOIN оставляет только пары строк, удовлетворяющие условию соединения. FULL JOIN, или FULL OUTER JOIN, дополнительно возвращает несовпавшие строки обеих таблиц, подставляя NULL в поля отсутствующей стороны. Повторяющиеся ключи могут размножать строки в обоих вариантах; JOIN не означает автоматическое удаление дублей.
Чем отличается INNER JOIN от FULL JOIN?
INNER JOIN возвращает совпавшие пары строк, а FULL OUTER JOIN также сохраняет строки без пары с обеих сторон, заполняя отсутствующие поля значениями NULL.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
INNER JOIN возвращает пары строк двух таблиц, для которых условие соединения истинно. Если строка не нашла соответствия на другой стороне, она не попадет в результат.
FULL JOIN, полная запись — FULL OUTER JOIN, возвращает все совпавшие пары и дополнительно строки без соответствия с обеих сторон. У таких строк поля отсутствующей стороны заполняются значениями NULL.
Предположим, в таблице a есть уникальные ключи 1 и 2, а в таблице b — 2 и 3:
SELECT a.id AS a_id, b.id AS b_id
FROM a
INNER JOIN b ON a.id = b.id;
В результате будет одна пара: (2, 2). Если заменить INNER JOIN на FULL OUTER JOIN, получатся три пары: (1, NULL), (2, 2) и (NULL, 3). Порядок этих строк без ORDER BY не гарантирован.
Есть несколько важных нюансов. Во-первых, соединение работает со строками, а не с уникальными множествами ключей. Если одному значению соответствуют две строки слева и три справа, соединение по этому значению создаст шесть пар.
Во-вторых, сравнение NULL = NULL не является истинным, поэтому обычное равенство не соединяет такие ключи друг с другом. В-третьих, фильтр в WHERE после полного соединения может убрать добавленные строки с NULL и изменить смысл результата.
INNER JOIN подходит, когда нужны только найденные соответствия. FULL JOIN полезен для сверки двух источников и поиска расхождений в обе стороны. Поддержку полного соединения и его синтаксис проверяют для выбранной СУБД.