Чем INNER JOIN отличается от LEFT JOIN?
Соединяю клиентов с заказами. При INNER JOIN клиенты без заказов пропадают, а мне нужно показать всех клиентов. В чём разница между INNER JOIN и LEFT JOIN? Когда какой использовать?
2 ответа
Разница в том, что делать со строками без пары:
- INNER JOIN — оставляет только строки, у которых есть совпадение в обеих таблицах.
- LEFT JOIN (полностью
LEFT OUTER JOIN) — оставляет все строки левой таблицы, а где пары справа нет — подставляет NULL.
Чтобы показать всех клиентов и их заказы (включая клиентов без заказов):
SELECT c.name, o.id AS order_id
FROM customers AS c
LEFT JOIN orders AS o
ON o.customer_id = c.id;
У клиента без заказов order_id будет NULL.
Хитрый приём — найти именно тех, у кого нет пары (клиентов без единого заказа):
SELECT c.name
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.id
WHERE o.id IS NULL;
Здесь WHERE o.id IS NULL ловит строки, где справа ничего не нашлось.
Частая ошибка: написать LEFT JOIN, а потом в WHERE поставить условие на правую таблицу вроде WHERE o.status = 'paid'. Это превращает LEFT JOIN обратно в INNER, потому что NULL не проходит условие. Условие на правую таблицу при LEFT JOIN надо класть в ON, а не в WHERE.
Коротко: INNER = пересечение, LEFT = всё слева плюс совпадения справа. Есть ещё RIGHT JOIN (всё справа) и FULL JOIN (всё с обеих сторон), но на практике 95% случаев закрывают INNER и LEFT. Правило: «нужны все из главной таблицы, даже без связанных данных» → LEFT JOIN. «Нужны только те, у кого есть связь» → INNER JOIN.