Короткий ответ
INNER JOIN оставляет строки только при совпадении с обеих сторон. LEFT JOIN дополнительно сохраняет несовпавшие строки левой таблицы, заполняя столбцы правой стороны значениями NULL.
Как это работает подробнее
Условие в ON определяет пары строк. Если одной строке слева соответствуют три строки справа, соединение создаст три строки независимо от вида соединения.
Поэтому LEFT JOIN гарантирует сохранение левых строк, но не гарантирует, что итоговое количество строк равно числу строк слева: связь один-ко-многим увеличивает результат.
Сравнение
- INNER JOIN — нужны только объекты со связанной записью — несовпавшие строки исключаются.
- LEFT JOIN — нужно сохранить все объекты слева — справа возможны
NULL.
Пример кода
query.sql
SELECT c.customer_id, COUNT(o.order_id) AS orders_cnt
FROM customers AS c
LEFT JOIN orders AS o
ON o.customer_id = c.customer_id
GROUP BY c.customer_id
ORDER BY c.customer_id;Что использовать на практике
- Сверяйте гранулярность. До соединения определите, уникален ли ключ в правой таблице.
- Считайте отсутствующие связи. После
LEFT JOINиспользуйтеCOUNT(o.order_id), а неCOUNT(*), чтобы клиент без заказов получил ноль.
Подводные камни
- Потеря строк.
INNER JOINисключит клиентов без заказов. - Размножение строк. Неуникальный ключ справа способен завысить суммы и количество объектов.