Короткий ответ
INNER JOIN возвращает только строки, для которых есть совпадение в обеих таблицах, а LEFT JOIN возвращает все строки левой таблицы, подставляя NULL в колонки правой таблицы, если совпадения нет.
Как это работает подробнее
INNER JOIN выполняет пересечение по условию ON — строка попадает в результат только при наличии совпадения с другой стороны. LEFT JOIN сохраняет все строки левой таблицы независимо от совпадения, дополняя отсутствующие значения NULL.
Пример кода
example.sql
SELECT u.id, u.name, COUNT(o.id) AS orders_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.name;
-- Пользователь без заказов попадёт в результат с orders_count = 0
-- При INNER JOIN вместо LEFT JOIN такой пользователь исчезнет из результатаЧто использовать на практике
- Практика. LEFT JOIN используют, когда нужно показать все записи «главной» сущности, даже без связанных данных — например, всех пользователей, включая тех, у кого пока нет заказов. INNER JOIN применяют, когда связанные данные обязательны для смысла строки.
Подводные камни
- Ошибка. Добавляют условие на колонку правой таблицы в WHERE вместо ON при LEFT JOIN (например WHERE orders.status = 'paid'), что превращает LEFT JOIN обратно в INNER JOIN, отфильтровывая пользователей без заказов.