Вопрос с собеседования · Базы данных

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

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

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

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

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

Подробно

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

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования