Какие типы JOIN в SQL вы знаете и в чем их отличие?

«Какие типы JOIN в SQL вы знаете и в чем их отличие?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Типы JOIN определяют, как строки из двух или более таблиц объединяются на основе условия.

Тип JOIN Описание Использование
INNER JOIN Возвращает только строки, где есть совпадение в обеих таблицах. Получение связанных данных, которые существуют в обеих таблицах.
LEFT (OUTER) JOIN Возвращает все строки из левой таблицы и совпадающие из правой. При отсутствии совпадений поля правой таблицы будут NULL. Анализ данных, включая записи, у которых может не быть связей (например, заказы без клиентов).
RIGHT (OUTER) JOIN Обратный LEFT JOIN. Возвращает все строки из правой таблицы и совпадающие из левой. Аналогично LEFT JOIN, но когда приоритетна правая таблица.
FULL (OUTER) JOIN Возвращает все строки из обеих таблиц. Совпадающие строки объединяются, а отсутствующие совпадения заполняются NULL. Объединение двух наборов данных с сохранением всех записей.
CROSS JOIN Декартово произведение: каждая строка первой таблицы соединяется с каждой строкой второй. Создание всевозможных комбинаций (например, для тестовых данных).
SELF JOIN Соединение таблицы с самой собой (обычно с использованием псевдонимов). Работа с иерархическими данными (например, сотрудник -> менеджер).

Примеры SQL:

-- INNER JOIN: Только пользователи с заказами
SELECT u.name, o.id FROM users u INNER JOIN orders o ON u.id = o.user_id;

-- LEFT JOIN: Все пользователи, даже без заказов
SELECT u.name, o.id FROM users u LEFT JOIN orders o ON u.id = o.user_id;

-- SELF JOIN: Иерархия сотрудников
SELECT e.name AS employee, m.name AS manager
FROM employees e LEFT JOIN employees m ON e.manager_id = m.id;

В Java-экосистеме (Hibernate/JPA) JOIN-операции часто выражаются через связи сущностей (@OneToMany, @ManyToOne) или явно в JPQL/HQL.