Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое 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 потому что:
- Результат будет меньше (меньше строк)
- База может оптимизировать быстрее (не нужно искать NULL значения)
- Индексы работают эффективнее
-- Быстро
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)
Важные моменты
- 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;
- NULL в JOIN: Если в условии JOIN есть NULL, строка не будет объединена:
SELECT *
FROM users u
INNER JOIN orders o ON u.id = o.user_id; -- NULL != NULL, не объединяется
- Порядок таблиц: При 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 запросах