В чем разница между INNER JOIN и LEFT JOIN в SQL? Приведи практический пример на таблицах users и orders.

INNER JOIN и LEFT JOIN — два наиболее часто используемых типа объединения таблиц в SQL. Они решают разные задачи, и понимание их различий критически важно для написания корректных запросов.

## INNER JOIN

INNER JOIN возвращает только те строки, для которых есть совпадение в обеих таблицах. Если запись существует в одной таблице, но не имеет соответствия в другой — она не попадёт в результат.

**Пример:**
Предположим, у нас есть две таблицы:

Таблица `users`:
| id | name |
|—-|———-|
| 1 | Алексей |
| 2 | Мария |
| 3 | Иван |

Таблица `orders`:
| id | user_id | product |
|—-|———|—————|
| 1 | 1 | Ноутбук |
| 2 | 1 | Мышь |
| 3 | 2 | Клавиатура |

Запрос с INNER JOIN:
sql
SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;

Результат:
| name | product |
|———|————-|
| Алексей | Ноутбук |
| Алексей | Мышь |
| Мария | Клавиатура |

Иван не попал в результат, потому что у него нет заказов.

## LEFT JOIN

LEFT JOIN (или LEFT OUTER JOIN) возвращает все строки из левой таблицы (той, что указана до JOIN), и совпадающие строки из правой. Если совпадения нет — поля из правой таблицы заполняются значением NULL.

Запрос с LEFT JOIN:
sql
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

Результат:
| name | product |
|———|————-|
| Алексей | Ноутбук |
| Алексей | Мышь |
| Мария | Клавиатура |
| Иван | NULL |

Теперь Иван присутствует в результате, но поле product равно NULL, так как у него нет заказов.

## Когда что использовать?

— **INNER JOIN** — когда нужны только записи с полным совпадением в обеих таблицах. Например, список пользователей, которые действительно что-то купили.
— **LEFT JOIN** — когда нужно сохранить все записи из левой таблицы, даже если для них нет данных в правой. Например, список всех пользователей с их заказами (включая тех, кто ничего не заказывал).

Практический совет: LEFT JOIN часто используют для поиска «сирот» — записей без связанных данных. Добавив условие `WHERE orders.id IS NULL`, можно найти всех пользователей без заказов:

sql
SELECT users.name
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.id IS NULL;

Это вернёт только Ивана — пользователя без единого заказа.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.