← Все вопросы

Чем INNER JOIN отличается от LEFT JOIN?

Задан 19 месяцев назад849 просмотров2 ответа
11

Соединяю клиентов с заказами. При INNER JOIN клиенты без заказов пропадают, а мне нужно показать всех клиентов. В чём разница между INNER JOIN и LEFT JOIN? Когда какой использовать?

2 ответа

15
✓ Принятый ответ — помог автору

Разница в том, что делать со строками без пары:

  • 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.

6

Коротко: INNER = пересечение, LEFT = всё слева плюс совпадения справа. Есть ещё RIGHT JOIN (всё справа) и FULL JOIN (всё с обеих сторон), но на практике 95% случаев закрывают INNER и LEFT. Правило: «нужны все из главной таблицы, даже без связанных данных» → LEFT JOIN. «Нужны только те, у кого есть связь» → INNER JOIN.

Ваш ответ

Войдите, чтобы ответить на вопрос.