Как соединить две таблицы по общему ключу (INNER JOIN)?
Есть таблица заказов с полем customer_id и отдельная таблица клиентов. Хочу вывести заказы вместе с именем клиента. Как соединить две таблицы в SQL? Что такое JOIN и по какому полю их связывать?
2 ответа
Связывание таблиц делается через JOIN с условием ON, где указываются совпадающие столбцы:
SELECT orders.id, orders.total, customers.name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.id;
Читается так: «для каждой строки заказа найди клиента, у которого customers.id равен orders.customer_id, и подставь его имя».
INNER JOIN (можно писать просто JOIN) оставляет только те строки, где нашлась пара в обеих таблицах. Если у заказа customer_id указывает на несуществующего клиента — такой заказ в результат не попадёт.
Чтобы не писать длинные имена таблиц, используют алиасы:
SELECT o.id, o.total, c.name
FROM orders AS o
JOIN customers AS c ON o.customer_id = c.id;
Частые ошибки новичков:
- Забыть
ON— некоторые СУБД тогда сделают декартово произведение (каждая строка с каждой), и строк станет в разы больше. - Соединять не по тем столбцам — связывать надо первичный ключ одной таблицы с внешним ключом другой.
- Неоднозначные имена: если столбец
idесть в обеих таблицах, надо уточнятьo.idилиc.id.
Полезная картинка в голове: INNER JOIN — это пересечение двух множеств. Останутся только строки, у которых есть соответствие и слева, и справа. Если хотя бы для одной стороны пары нет — строка отбрасывается. Когда нужно сохранить строки даже без пары (например, клиентов вообще без заказов), берут LEFT JOIN вместо INNER.