Что делает LEFT JOIN в SQL
Что проверяют
Умеете ли вы сами достать данные для проверки, а не ждать разработчика. Тестировщику LEFT JOIN нужен прежде всего для поиска «сирот» и расхождений между таблицами, поэтому следом часто просят написать такой запрос или объяснить, почему строк в результате больше, чем ожидалось.
Как отвечать
LEFT JOIN возвращает все строки левой таблицы. Для каждой ищется пара в правой по условию ON. Если пара нашлась, строки склеиваются. Если нет, колонки правой таблицы заполняются NULL.
SELECT o.id, o.created_at
FROM orders o
LEFT JOIN payments p ON p.order_id = o.id
WHERE p.id IS NULL;Это классический запрос для тестировщика: заказы без оплаты. Тем же приёмом ищут пользователей без профиля, товары без цены, записи, оставшиеся после удаления родителя.
Что ещё стоит сказать:
- отличие от INNER JOIN: тот оставляет только строки с парой, LEFT JOIN сохраняет левую сторону целиком;
- размножение строк: если у заказа три платежа, заказ попадёт в результат трижды. Для подсчёта заказов нужен
COUNT(DISTINCT o.id); - агрегаты:
COUNT(p.id)даст ноль для заказа без платежей, аCOUNT(*)даст единицу, потому что строка сNULLвсё равно есть; - RIGHT JOIN: тот же LEFT с переставленными таблицами, на практике почти всегда пишут LEFT.
Где спотыкаются
Ставят условие на правую таблицу в WHERE, например WHERE p.status = 'paid'. Строки с NULL отсекаются, и LEFT JOIN молча превращается в INNER. Если нужны все заказы и при них только оплаченные платежи, условие переносят в ON.
Не ждут дублей и делают вывод «в базе лишние заказы», хотя это эффект связи один-ко-многим в самом запросе.
Проверяют отсутствие пары через необязательную колонку: WHERE p.status IS NULL. Если status в правой таблице сам бывает пустым, запрос найдёт лишнее. Надёжнее проверять первичный ключ правой таблицы, например p.id.