Ответ
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:
- Возвращает только пересечение: Строки без совпадения в связанной таблице не включаются в результат (заказ с
order_id=3иcustomer_id=999пропал). - Порядок таблиц не важен:
A JOIN Bдаёт тот же результат, что иB JOIN A. - Условие соединения (ON) критично: Обычно это равенство первичного ключа одной таблицы и внешнего ключа другой.
- Множественные 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";