Какое минимальное и максимальное количество строк вернет запрос SELECT * FROM A LEFT JOIN B
Что проверяют
Понимаете ли вы семантику внешнего соединения на уровне «сколько строк получится», а не на уровне «LEFT это когда слева». Вопрос с подвохом: правильный ответ зависит от условия соединения, и хороший кандидат сам его уточняет.
Как отвечать
Пусть в A n строк, в B m строк. Каждая строка A попадает в результат хотя бы один раз: если пары в B не нашлось, строка вернётся с NULL в колонках B. Если пар несколько, строка размножится по числу совпадений.
Отсюда границы:
- минимум n строк, когда ни одна строка
Aне имеет пары вB, или каждая имеет ровно одну; - *максимум n m строк**, когда каждая строка
Aсовпадает с каждой строкойB, например при соединении по неуникальному ключу или по условиюON true; - ноль строк только в одном случае: когда сама
Aпуста.
Отдельно стоит сказать, что классический LEFT JOIN без ON в большинстве баз это синтаксическая ошибка: писать нужно LEFT JOIN B ON .... Если условие соединения тождественно истинно, соединение вырождается в декартово произведение, и это и есть верхняя граница.
-- 3 строки в A, 4 в B
select * from a left join b on a.id = b.a_id; -- от 3 до 12 строк
select * from a left join b on true; -- ровно 12Заодно полезно упомянуть частую ошибку рядом: условие фильтрации правой таблицы в WHERE вместо ON превращает внешнее соединение во внутреннее, потому что NULL не проходит проверку.
Где спотыкаются
Отвечают «минимум ноль». Ноль возможен только при пустой A, а вопрос обычно про непустую таблицу.
Считают максимумом n, забывая про дубликаты ключа в B. Именно эта ошибка потом даёт неожиданно разросшийся отчёт в проде.
Путают LEFT JOIN с INNER JOIN в объяснении: во внешнем соединении строки левой таблицы не пропадают никогда.