В чем разница между 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;
Это вернёт только Ивана — пользователя без единого заказа.
