Что такое INNER JOIN в SQL?

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

Ответ

INNER JOIN — это операция реляционной алгебры в SQL, которая объединяет строки из двух или более таблиц на основе совпадения значений в связанных столбцах. В результирующий набор попадают только те строки, для которых условие соединения (ON) истинно в обеих таблицах.

Базовый синтаксис:

SELECT table1.column1, table2.column2, ...
FROM table1
INNER JOIN table2 ON table1.matching_column = table2.matching_column;
-- Ключевое слово INNER часто опускают, пишут просто JOIN

Наглядный пример:

-- Таблица `orders` (заказы)          -- Таблица `customers` (клиенты)
-- order_id | customer_id | amount    -- customer_id | name
-- 1        | 101         | 100.00   -- 101         | Alice
-- 2        | 102         | 200.00   -- 102         | Bob
-- 3        | 999         | 50.00    -- 103         | Charlie
-- (customer_id=999 не существует в customers)

SELECT orders.order_id, customers.name, orders.amount
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
Результат запроса: order_id name amount
1 Alice 100.00
2 Bob 200.00

Ключевые особенности INNER JOIN:

  1. Возвращает только пересечение: Строки без совпадения в связанной таблице не включаются в результат (заказ с order_id=3 и customer_id=999 пропал).
  2. Порядок таблиц не важен: A JOIN B даёт тот же результат, что и B JOIN A.
  3. Условие соединения (ON) критично: Обычно это равенство первичного ключа одной таблицы и внешнего ключа другой.
  4. Множественные JOIN: Можно последовательно соединять много таблиц.

Сравнение с другими типами JOIN:

  • INNER JOIN: Только совпадающие строки из обеих таблиц.
  • LEFT (OUTER) JOIN: Все строки из левой таблицы + совпадающие из правой (при отсутствии совпадения — NULL).
  • RIGHT (OUTER) JOIN: Все строки из правой таблицы + совпадающие из левой.
  • FULL (OUTER) JOIN: Все строки из обеих таблиц.

В контексте Java (JPA/Hibernate): INNER JOIN часто выполняется неявно при навигации по связанным сущностям (@ManyToOne, @OneToMany) или явно с помощью JPQL:

// JPQL пример
String jpql = "SELECT o FROM Order o INNER JOIN o.customer c WHERE c.name = :name";