Получить доступ

Что вернёт INNER JOIN?

JuniorJOIN, ключи и ограниченияSQL
Ещё спрашивают так:
  • Что такое JOIN в SQL?
  • Почему после JOIN строк стало больше?
Коротко

INNER JOIN возвращает только пары строк, удовлетворяющие условию ON. Строки без пары в результат не попадают.

  • Одна строка с тремя парами даст три строки результата
  • Без условия — декартово произведение
  • Для сохранения непарных строк — LEFT/RIGHT/FULL JOIN

А ещё JOIN по неуникальному ключу — частая причина задвоенных сумм

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

INNER JOIN сопоставляет строки двух таблиц по условию (обычно равенство ключей) и возвращает каждую подходящую пару. Если у заказа два товара, строка заказа повторится дважды — по разу на каждую позицию.

Следствия:

  • строки без пары (клиент без заказов) пропадают — для их сохранения нужен LEFT JOIN;
  • соединение «один ко многим» размножает строки «одной» стороны — при подсчёте сумм по ней получается завышенный результат. Решение — агрегировать до JOIN или считать count(DISTINCT ...);
  • забытое или неправильное условие даёт декартово произведение — миллионы строк.

Как выполняется: вложенные циклы с индексом (мало строк), хеш-соединение (большие таблицы, равенство), слияние (отсортированные входы) — выбирает оптимизатор, смотреть в EXPLAIN.

Пример

SELECT o.id, c.name
FROM orders o
JOIN customers c ON c.id = o.customer_id;   -- заказы с найденным клиентом

Что хотят услышать

  • Только совпавшие пары, непарные отбрасываются.
  • Размножение строк при «один ко многим».
  • Отличие от внешних соединений.

Частые ошибки

  • Считать суммы после JOIN с таблицей «многих» без учёта повторов.
  • Забыть условие соединения.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Все строки левой таблицы и совпавшие справа
  • ✓Только строки, для которых найдено совпадение по условию соединения
  • ✗Декартово произведение без условия
  • ✗Все строки обеих таблиц с NULL для отсутствующих совпадений

Что спросят дальше

  • Чем ON отличается от WHERE при LEFT JOIN?
  • Что такое CROSS JOIN?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем