JOIN: соединяем таблицы
JOIN, один из самых мощных и важных инструментов SQL. Он позволяет соединять данные из нескольких таблиц в один результат.
Зачем JOIN
У нас есть таблица orders и customers. В orders хранится только customer_id. Чтобы узнать имя клиента, нужно "соединить" таблицы по этому ключу.
INNER JOIN, только совпадающие строки
SELECT
o.id AS order_id,
c.name AS customer,
c.city,
o.amount
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;
o и c, псевдонимы таблиц. ON указывает по какому условию соединять.
Результат, только заказы у которых есть клиент, и только клиенты у которых есть заказы.
LEFT JOIN, все строки из левой таблицы
-- Все клиенты, даже без заказов
SELECT
c.name,
COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name;
Клиенты без заказов тоже попадут в результат, у них order_count = 0.
Разница INNER vs LEFT
customers: Алекс, Мария, Дмитрий
orders: заказы от Алекса и Марии (у Дмитрия нет)
INNER JOIN → Алекс, Мария (Дмитрий выброшен)
LEFT JOIN → Алекс, Мария, Дмитрий (NULL в полях заказа)
JOIN трёх таблиц
SELECT
o.id AS order_id,
c.name AS customer,
p.name AS product,
oi.quantity,
oi.price
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN order_items oi ON oi.order_id = o.id
JOIN products p ON oi.product_id = p.id
ORDER BY o.id;
Каждый JOIN добавляет ещё одну таблицу к результату.
COALESCE, замена NULL
SELECT
name,
COALESCE(phone, 'не указан') AS phone
FROM users;
COALESCE возвращает первый не-NULL аргумент. Удобно для замены NULL на читаемое значение.
💡 Главная мысль: INNER JOIN, только совпадения. LEFT JOIN, все строки из левой таблицы, даже без пары. Самая частая ошибка, потеря строк из-за NULL в ключе соединения.