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

Что такое INNER JOIN?

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

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

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

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

INNER JOIN: глубокое понимание

INNER JOIN — это одна из самых частых и важных операций в SQL, которая возвращает только те строки, для которых существуют совпадения в обеих таблицах. Это основа для связывания данных в релационной базе.

Концепция и синтаксис

INNER JOIN (внутреннее соединение) работает по принципу пересечения множеств: возвращаются только совпадающие строки из обеих таблиц.

SELECT u.id, u.name, o.order_id, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

Визуально это выглядит как пересечение двух кругов в диаграмме Венна.

Примеры использования

-- Пользователи, у которых есть хотя бы один заказ
SELECT u.id, u.name, COUNT(o.id) as order_count
FROM users u
INNER JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name
ORDER BY order_count DESC;

-- Результат: Alice (2 заказа), Bob (1 заказ)
-- Charlie (без заказов) не появится!
-- Соединение через несколько таблиц
SELECT u.name, o.order_id, p.product_name, oi.quantity
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE o.total > 100;

INNER JOIN vs LEFT/RIGHT JOIN

Основное отличие — обработка «сирот»:

ТипРезультатИспользуется
INNER JOINТолько совпаденияКогда нужна чистая связь
LEFT JOINВсе из левой + совпаденияКогда нужны все левые + их связи
RIGHT JOINВсе из правой + совпаденияРеже (лучше LEFT JOIN)
FULL OUTER JOINВсе из обеихКогда нужны все с обеих сторон
-- INNER: 2 пользователя (Alice, Bob)
SELECT u.name FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- LEFT: 3 пользователя (Alice, Bob, Charlie с NULL)
SELECT u.name FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

Производительность и оптимизация

INNER JOIN обычно быстрее, чем LEFT/RIGHT JOIN:

  1. Меньше строк в результате — фильтрация происходит на уровне JOIN
  2. Лучше работает индексация — SQL-оптимизатор точно знает, что нужны только совпадения
  3. Меньше памяти — не нужно хранить NULL значения
-- ПЛОХО: LEFT JOIN + WHERE (может быть неэффективно)
SELECT u.name, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.order_id IS NOT NULL;
-- Это по сути INNER JOIN!

-- ХОРОШО: сразу используй INNER JOIN
SELECT u.name, o.order_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

Условия соединения

Условие ON — критично для корректного результата:

-- Правильно: соединяем по внешним ключам
SELECT * FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- Опасно: декартово произведение!
SELECT * FROM users u
INNER JOIN orders o ON u.created_at = o.created_at;
-- Может вернуть миллионы строк!

-- Множественные условия
SELECT * FROM orders o
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
  AND p.is_active = 1; -- условие фильтрации

PHP пример с PDO

<?php
$sql = 'SELECT u.id, u.name, o.order_id, o.total, p.product_name
        FROM users u
        INNER JOIN orders o ON u.id = o.user_id
        INNER JOIN order_items oi ON o.id = oi.order_id
        INNER JOIN products p ON oi.product_id = p.id
        WHERE o.status = "completed"
        ORDER BY u.name';

$stmt = $pdo->prepare($sql);
$stmt->execute();
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($orders as $order) {
    echo "{$order['name']} купил {$order['product_name']} за {$order['total']}\n";
}
?>

Best practices

  • Используй INNER JOIN когда уверен, что связь существует
  • Проверяй индексы на колонках в условии ON
  • Избегай длинных цепочек INNER JOIN (максимум 5-7)
  • EXPLAIN ANALYZE — твой лучший друг
  • Обычно INNER JOIN быстрее LEFT JOIN на больших таблицах

Вывод

INNER JOIN — это основной инструмент для связывания таблиц. Понимание его работы, особенно в контексте индексации и производительности, критично для написания эффективных SQL-запросов.

Что такое INNER JOIN? | PrepBro