Какой join возвращает наибольшее количество записей?
Что проверяют
Понимаете ли вы, откуда берётся число строк в результате соединения, а не помните ли названия JOIN. Следом обычно дают две маленькие таблицы и просят посчитать строки для каждого вида, а потом спрашивают, почему после JOIN в отчёте задвоилась выручка.
Как отвечать
Ответ из двух частей. Без условия больше всех возвращает CROSS JOIN: декартово произведение, 1000 клиентов на 300 заказов дают 300 000 строк. Среди соединений с одним и тем же условием ON не меньше остальных возвращает FULL OUTER JOIN:
INNER JOIN: только совпавшие пары, нижняя граница;LEFT JOIN: все совпадения плюс строки левой таблицы без пары, сNULLсправа;RIGHT JOIN: то же зеркально;FULL OUTER JOIN: совпадения плюс непарные строки с обеих сторон.
При этом LEFT JOIN не гарантирует число строк левой таблицы. Если ключ справа не уникален, строка слева размножится по числу совпадений: клиент с пятью заказами даст пять строк. Для аналитика это главный практический риск, суммы и средние после такого соединения завышены.
Как себя проверять: считать COUNT(*) и COUNT(DISTINCT customer_id) до и после соединения, заранее знать кардинальность связи (один к одному, один ко многим, многие ко многим) и агрегировать правую таблицу до JOIN, если нужна одна строка на клиента.
Нюанс для сильного ответа: если одна из таблиц пустая, CROSS JOIN вернёт ноль строк, а FULL JOIN вернёт все строки второй.
Где спотыкаются
Отвечают «LEFT JOIN», потому что он «возвращает все строки». Он гарантирует все строки левой таблицы, но FULL JOIN с тем же условием вернёт не меньше, а CROSS JOIN обычно намного больше.
Считают, что результат не может быть больше самой крупной таблицы. При связи многие ко многим он легко вырастает в разы.
Ставят в WHERE условие по правой таблице после LEFT JOIN. Строки с NULL отсекаются, и соединение фактически превращается в INNER JOIN.