В чем разница между типами JOIN, если они выводят одинаковые столбцы
Что проверяют
Понимаете ли вы, что список колонок задаёт SELECT, а тип JOIN решает, какие строки попадут в результат. Для тестировщика это рабочий навык: проверить данные в базе, найти потерянные записи, сверить счётчики. Следом обычно просят написать запрос, который находит пользователей без заказов.
Как отвечать
Возьмите две таблицы, users и orders, и один и тот же SELECT u.id, o.amount. Меняется только набор строк:
INNER JOIN: только пары, где условиеONсовпало. Пользователь без заказов из результата пропадает;LEFT JOIN: все строки левой таблицы. Там, где справа пары нет, в колонкахordersбудетNULL;RIGHT JOIN: зеркально, все строки правой таблицы. На практике его обычно переписывают вLEFT JOIN, поменяв таблицы местами;FULL OUTER JOIN: все строки обеих таблиц, сNULLтам, где пары нет. В MySQL его нет, эмулируют черезUNIONдвух запросов;CROSS JOIN: каждая строка с каждой, декартово произведение.
Отдельно скажите про количество строк: при связи «один ко многим» пользователь с тремя заказами даст три строки, и COUNT(*) после JOIN уже не равен числу пользователей.
Классический тестовый запрос на целостность данных:
SELECT u.id FROM users u LEFT JOIN orders o ON o.user_id = u.id WHERE o.id IS NULL
Он находит пользователей без заказов. Тем же приёмом в обратную сторону ищутся заказы, которые ссылаются на удалённого пользователя.
Где спотыкаются
Ставят условие на правую таблицу в WHERE, например WHERE o.status = 'paid' после LEFT JOIN. Строки с NULL отбрасываются, и запрос молча превращается в INNER JOIN. Такое условие нужно переносить в ON.
Считают COUNT(*) там, где нужен COUNT(o.id). После LEFT JOIN пользователь без заказов даст единицу вместо нуля.
Отвечают определениями без примера. Интервьюеру важнее увидеть, что вы на конкретных данных предскажете число строк и появление NULL.