Это очень хорошая задача на понимание JOIN, потому что она проверяет не синтаксис, а то, как ты реально представляешь себе соединение таблиц.
Условие:
- есть таблица
Aс 5 строками - есть таблица
Bс 10 строками - поле
IDв обеих таблицах неуникальное
Вопрос:
- какое минимальное и максимальное количество строк может получиться после
INNER JOINLEFT JOINFULL JOINCROSS JOIN
Короткий ответ
INNER min 0 max 50
LEFT min 5 max 50
FULL min 10 max 50
CROSS min 50 max 50
Теперь разберем, почему именно так.
Почему вообще количество строк может сильно вырасти
Потому что JOIN соединяет строки не “один к одному”, а по всем подходящим совпадениям.
Если в таблице A одна строка совпадает с тремя строками из B, то после join она даст уже три строки.
Если таких совпадений много, результат может разрастись очень сильно.
Именно это часто происходит в реальной аналитике, когда после JOIN число строк внезапно становится больше, чем было.
1. INNER JOIN
Минимум
Минимум — 0.
Почему:
- если между таблицами вообще нет совпадений по
ID,INNER JOINне вернет ни одной строки
Пример логики:
- в
AтолькоID = 1 - в
BтолькоID = 2 - совпадений нет
- результат пустой
Максимум
Максимум — 5 * 10 = 50.
Почему:
- если все 5 строк из
Aсовпадают со всеми 10 строками изBпо одному и тому жеID - тогда каждая строка
Aсоединится с каждой строкойB
Итого:
INNER JOIN -> min 0, max 50
2. LEFT JOIN
Минимум
Минимум — 5.
Почему:
LEFT JOINвсегда сохраняет все строки из левой таблицыA- даже если совпадений в
Bнет вообще
Тогда просто получим:
- все 5 строк из
A - столбцы из
BбудутNULL
Максимум
Максимум — 50.
Почему:
- если каждая строка из
Aматчится со всеми 10 строкамиB - тогда получаем те же
5 * 10 = 50
Итого:
LEFT JOIN -> min 5, max 50
3. FULL JOIN
Минимум
Минимум — 10.
Здесь нужно думать аккуратно.
FULL JOIN возвращает:
- все совпавшие строки
- все несовпавшие строки из
A - все несовпавшие строки из
B
Минимум будет достигаться тогда, когда:
- каждая строка из меньшей таблицы
Aнашла себе совпадение - каждая строка из
Bтоже вошла в совпадения - и итоговое число строк получилось как можно меньше
Такое возможно, если 10 строк B “покрывают” все соединение, а 5 строк A распределяются внутри этих матчей без дополнительного раздувания.
Интуитивно минимум для FULL JOIN равен:
max(5, 10) = 10
Максимум
Максимум — 50.
Почему:
- если все строки совпадают по одному
ID - тогда получаем декартово количество совпадений
5 * 10
Дополнительных несовпавших строк уже не будет, потому что все и так попали в матч.
Итого:
FULL JOIN -> min 10, max 50
4. CROSS JOIN
С CROSS JOIN все проще всего.
Он вообще не смотрит на ключи и условия совпадения. Это чистое декартово произведение.
Каждая строка A соединяется с каждой строкой B.
Минимум
50
Максимум
Тоже 50
Потому что:
5 * 10 = 50
И это всегда фиксированное число.
Итого:
CROSS JOIN -> min 50, max 50
Финальная таблица
INNER min 0 max 50
LEFT min 5 max 50
FULL min 10 max 50
CROSS min 50 max 50
Как быстро объяснять это на собеседовании
Хороший ответ обычно звучит так:
INNER JOIN: от0доA * BLEFT JOIN: от количества строк в левой таблице доA * BFULL JOIN: отmax(A, B)доA * BCROSS JOIN: всегдаA * B
Для этой задачи:
A = 5B = 10
значит:
INNER:0..50LEFT:5..50FULL:10..50CROSS:50..50
Почему эта тема важна не только для собеседований
Потому что именно она помогает понять одну из самых частых проблем в аналитике:
- после
JOINданных стало больше, чем было
И если человек не понимает кратность совпадений, он может:
- посчитать неверную выручку
- задвоить пользователей
- раздуть метрики
Поэтому эта задача — не просто “теория для интервью”, а очень практическая проверка мышления.
Итог
Если в двух таблицах 5 и 10 строк, а ключ неуникальный, то количество строк после JOIN зависит от типа соединения и структуры совпадений.
Главный принцип такой:
- чем больше возможных совпадений между строками, тем сильнее раздувается результат
- максимум почти всегда ограничен произведением размеров таблиц
- минимум зависит от того, сохраняются ли строки одной или обеих таблиц при отсутствии совпадений
Именно понимание этой логики отличает человека, который просто знает названия JOIN, от человека, который реально понимает, как они работают.