Средний ~28 мин чтения

JOIN: объединение таблиц

Урок 3 из 6 в курсе SQL: быстрый старт

JOIN: объединение таблиц

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

Почему это важно: В нормализованной БД данные разбиты по таблицам. JOIN — единственный способ собрать их вместе. Непонимание JOIN приводит к N+1 запросам и загрузке лишних данных в приложение.

Главная идея

INNER JOIN возвращает только строки с совпадением в обеих таблицах; LEFT JOIN возвращает все строки левой таблицы, дополняя NULL там, где совпадения нет.

Как это выглядит на практике

  1. SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id
  2. INNER JOIN вернёт только пользователей, у которых есть заказы.
  3. LEFT JOIN вернёт всех пользователей, включая тех, у кого нет заказов (o.total будет NULL).
  4. Несколько 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 лучше нескольких отдельных запросов с точки зрения производительности.

Термины урока

INNER JOIN: строки с совпадением в обеих таблицах.
LEFT JOIN: все строки левой таблицы + совпадения из правой.
ON: условие соединения таблиц.
N+1 problem: паттерн, при котором для N строк выполняется N+1 запросов.

Связь с работой 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 быстрее.