← Назад к вопросам

Что такое INNER JOIN?

1.3 Junior🔥 231 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое INNER JOIN?

INNER JOIN — это один из самых распространённых типов объединения таблиц в SQL, который возвращает только те строки, где СОВПАДАЮТ значения в обеих таблицах.

Определение и синтаксис

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

SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.table1_id;

Или сокращённо (ключевое слово INNER опционально):

SELECT *
FROM table1
JOIN table2 ON table1.id = table2.table1_id;

Практический пример

Представим две таблицы:

Таблица users:

id | name      | age
---|-----------|----
1  | Alice     | 28
2  | Bob       | 35
3  | Charlie   | 22
4  | David     | 41

Таблица orders:

id | user_id | product       | price
---|---------|---------------|-------
1  | 1       | Laptop        | 1200
2  | 2       | Phone         | 800
3  | 2       | Tablet        | 400
4  | 5       | Monitor       | 350

Внимание: user_id = 5 не существует в таблице users!

INNER JOIN результат

SELECT u.name, u.age, o.product, o.price
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

Результат:

name    | age | product | price
--------|-----|---------|-------
Alice   | 28  | Laptop  | 1200
Bob     | 35  | Phone   | 800
Bob     | 35  | Tablet  | 400

Заметьте: Charlie (id=3) и David (id=4) НЕ в результате, потому что у них нет заказов. Order с user_id=5 тоже не в результате, потому что такого пользователя нет.

Визуализация INNER JOIN

Таблица 1          Таблица 2
(users)            (orders)

┌─────────┐       ┌─────────┐
│ id=1 ✓  │────→  │ user=1✓ │
│ id=2 ✓  │────→  │ user=2✓ │
│ id=3 ✗  │   X   │ user=2✓ │
│ id=4 ✗  │   X   │ user=5✗ │
└─────────┘       └─────────┘

✓ = совпадает (в результате)
✗ = не совпадает (НЕ в результате)

INNER JOIN возвращает только ПЕРЕСЕЧЕНИЕ двух таблиц.

Множественные JOIN'ы

Можно объединить три и больше таблиц:

SELECT u.name, o.product, c.comment
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN comments c ON o.id = c.order_id;

Условие: строка попадает в результат только если она есть во ВСЕХ трех таблицах.

Сложные условия

Можно использовать несколько условий в ON:

SELECT u.name, o.product
FROM users u
INNER JOIN orders o ON u.id = o.user_id AND o.price > 500;

Или использовать WHERE для дополнительной фильтрации:

SELECT u.name, o.product, o.price
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.price > 600;

INNER JOIN vs другие JOIN'ы

Для понимания различия:

LEFT JOIN (LEFT OUTER JOIN):

SELECT u.name, o.product
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

Результат: включит всех пользователей, даже без заказов

name    | product
--------|----------
Alice   | Laptop
Bob     | Phone
Bob     | Tablet
Charlie | NULL    ← нет заказов, но в результате
David   | NULL    ← нет заказов, но в результате

INNER JOIN результат (для сравнения):

name  | product
------|----------
Alice | Laptop
Bob   | Phone
Bob   | Tablet

Разница: LEFT JOIN включит пользователей БЕЗ заказов, INNER JOIN НЕ включит.

На примере Java с SQL

// Получить все заказы с информацией о пользователе
String sql = "SELECT u.name, u.email, o.product, o.price " +
             "FROM users u " +
             "INNER JOIN orders o ON u.id = o.user_id " +
             "ORDER BY u.name";

ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
    String name = rs.getString("name");
    String email = rs.getString("email");
    String product = rs.getString("product");
    double price = rs.getDouble("price");
    
    System.out.println(name + " купил " + product + " за " + price);
}

Реальный пример: Интернет-магазин

-- Получить список товаров в корзине каждого пользователя
SELECT 
    u.name,
    p.title,
    cp.quantity,
    (p.price * cp.quantity) as total
FROM users u
INNER JOIN shopping_carts sc ON u.id = sc.user_id
INNER JOIN cart_products cp ON sc.id = cp.cart_id
INNER JOIN products p ON cp.product_id = p.id
WHERE sc.is_active = true;

Логика:

  • Только пользователи с активной корзиной
  • Только товары, которые действительно в корзине
  • Только существующие товары

Производительность

INNER JOIN обычно быстрее LEFT JOIN потому что:

  1. Результат будет меньше (меньше строк)
  2. База может оптимизировать быстрее (не нужно искать NULL значения)
  3. Индексы работают эффективнее
-- Быстро
SELECT * FROM users u
INNER JOIN orders o ON u.id = o.user_id;  -- Меньше результат

-- Медленнее (может быть)
SELECT * FROM users u
LEFT JOIN orders o ON u.id = o.user_id;   -- Больше результат (с NULL)

Важные моменты

  1. ON vs WHERE: ON выполняется ДО объединения, WHERE ПОСЛЕ. Используй ON для условий объединения.
-- Правильно
SELECT *
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.price > 500;

-- Неправильно (менее эффективно)
SELECT *
FROM users u
INNER JOIN orders o ON u.id = o.user_id AND o.price > 500;
  1. NULL в JOIN: Если в условии JOIN есть NULL, строка не будет объединена:
SELECT *
FROM users u
INNER JOIN orders o ON u.id = o.user_id;  -- NULL != NULL, не объединяется
  1. Порядок таблиц: При INNER JOIN порядок таблиц НЕ имеет значения.
-- Оба вариант дают одинаковый результат
SELECT * FROM users u INNER JOIN orders o ON u.id = o.user_id;
SELECT * FROM orders o INNER JOIN users u ON u.id = o.user_id;

Заключение

INNER JOIN:

  • Возвращает ТОЛЬКО совпадающие строки
  • Исключает строки без пары в другой таблице
  • Самый строгий вид объединения
  • Используется, когда нужны только полные пары
  • Обычно быстрее других типов JOIN'ов
  • Основной инструмент в SQL запросах