INNER и LEFT JOIN: соединяем заказы, покупателей и товары одним запросом — вместо ручных .find() в коде.
В магазине появились покупатели и заказы:
| Таблица | Что хранит |
|---|---|
customers | покупатели: имя, город |
orders | заказы: кто (customer_id), когда, статус |
order_items | позиции заказа: какой товар, сколько, почём |
Заказ не хранит имя покупателя — только его id в колонке customer_id. Это внешний ключ: ссылка на строку другой таблицы.
customers orders
┌────┬───────┐ ┌────┬─────────────┬─────────┐
│ id │ name │ │ id │ customer_id │ status │
├────┼───────┤ ├────┼─────────────┼─────────┤
│ 1 │ Аня │ ◄───────────── │ 2 │ 1 │ paid │
│ 2 │ Борис │ ◄───────────── │ 3 │ 2 │ shipped │
└────┴───────┘ └────┴─────────────┴─────────┘JOIN склеивает строки двух таблиц по условию ON:
SELECT orders.id, customers.name
FROM orders
JOIN customers ON customers.id = orders.customer_id;Для каждой строки orders БД находит строку customers с совпавшим id и приклеивает её колонки справа. Колонки пишем через точку: таблица.колонка — иначе БД не поймёт, чей id ты имеешь в виду.
(Если не проходил его — не страшно: суть в том, что раньше данные из двух списков приходилось соединять вручную кодом.) Там ты соединял данные руками в JS:
const customer = customers.find(c => c.id === order.customerId);А если заказов 100 и по каждому идти в БД за покупателем — это знаменитая проблема N+1: 1 запрос за заказами + 100 за покупателями. JOIN делает то же самое одним запросом. 🚀
Выведи для каждого заказа: orders.id, customers.name и orders.status.