JOIN: объединение таблиц
JOIN соединяет строки из нескольких таблиц по условию, позволяя получать связанные данные одним запросом.
Почему это важно: В нормализованной БД данные разбиты по таблицам. JOIN — единственный способ собрать их вместе. Непонимание JOIN приводит к N+1 запросам и загрузке лишних данных в приложение.
Главная идея
INNER JOIN возвращает только строки с совпадением в обеих таблицах; LEFT JOIN возвращает все строки левой таблицы, дополняя NULL там, где совпадения нет.
Как это выглядит на практике
- SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id
- INNER JOIN вернёт только пользователей, у которых есть заказы.
- LEFT JOIN вернёт всех пользователей, включая тех, у кого нет заказов (o.total будет NULL).
- Несколько JOIN соединяют три и более таблицы в одном запросе.
Что происходит под капотом
- Алгоритмы JOIN: Nested Loop (для малых таблиц), Hash Join (для больших), Merge Join (для отсортированных).
- Планировщик БД выбирает алгоритм JOIN автоматически на основе статистики таблиц.
- JOIN без условия ON или WHERE (Cartesian product) возвращает все комбинации строк — обычно это ошибка.
- Индексы на столбцах JOIN (особенно foreign key) критически важны для производительности.
Типичные ошибки и заблуждения
- Ошибка: JOIN всегда медленный. С правильными индексами JOIN на миллионах строк работает за миллисекунды.
- Ошибка: LEFT JOIN и INNER JOIN дают одинаковый результат. INNER JOIN исключает строки без совпадения.
- Ошибка: лучше сделать два отдельных SELECT, чем один JOIN. Это создаёт N+1 проблему.
- Ошибка: JOIN применим только к двум таблицам. JOIN можно цепочкой соединять любое количество таблиц.
Ключевые выводы
- INNER JOIN — пересечение; LEFT JOIN — все строки левой таблицы.
- Всегда указывайте явное условие ON, чтобы избежать cartesian product.
- Индексы на столбцах JOIN ускоряют выполнение в разы.
- JOIN лучше нескольких отдельных запросов с точки зрения производительности.
Термины урока
Связь с работой backend-разработчика
ORM-фреймворки решают N+1 через eager loading (includes/joins). Понимание JOIN помогает правильно настраивать ORM и писать эффективные запросы вручную.
Мини-разбор реальной ситуации
Страница профиля пользователя загружает 150 мс. Логи показывают 51 SQL-запрос: 1 запрос за пользователем и 50 отдельных запросов за каждым заказом. Замена на JOIN + eager loading сокращает это до 2 запросов и 15 мс.
Что запомнить
- INNER JOIN исключает строки без совпадения; LEFT JOIN сохраняет их.
- N+1 запросов — признак отсутствующего JOIN или eager loading.
- Индексы на foreign key обязательны для быстрых JOIN.
Итог
JOIN — главный инструмент работы со связанными данными. Правильное его применение устраняет N+1 проблему и делает API быстрее.