JOIN SQL: как соединять таблицы в запросе

JOIN в SQL нужен, чтобы соединять данные из нескольких таблиц. Например, клиенты лежат в одной таблице, заказы — в другой, а в результате нужно увидеть имя клиента и сумму заказа рядом

Простой пример:

SELECT clients.name, orders.amount
FROM clients
JOIN orders ON orders.client_id = clients.id;

Запрос берет клиентов, находит их заказы по совпадению orders.client_id = clients.id и выводит общий результат

Зачем нужен JOIN

В нормальной базе данные не хранят все в одной огромной таблице. Клиенты, заказы, товары, платежи и категории обычно разделены. Это помогает не дублировать данные и поддерживать порядок в структуре

Но для отчета данные нужно собрать вместе. Вот здесь и нужен JOIN

clients.id → orders.client_id

Поле orders.client_id хранит ссылку на клиента. Условие ON объясняет базе, как связать строки

INNER JOIN

Обычный JOIN часто означает INNER JOIN. Он возвращает только строки, где связь нашлась в обеих таблицах

SELECT clients.name, orders.amount
FROM clients
INNER JOIN orders ON orders.client_id = clients.id;

Если у клиента нет заказов, он не попадет в результат. Это нормально, если вам нужен список только тех клиентов, у которых есть заказы

LEFT JOIN

LEFT JOIN возвращает все строки из левой таблицы и добавляет данные из правой, если связь найдена

SELECT clients.name, orders.amount
FROM clients
LEFT JOIN orders ON orders.client_id = clients.id;

Если у клиента нет заказа, клиент все равно будет в результате, а поля заказа будут NULL

Это удобно, когда нужно найти клиентов без заказов

SELECT clients.name
FROM clients
LEFT JOIN orders ON orders.client_id = clients.id
WHERE orders.id IS NULL;

Мини-практика

Создайте две таблицы и соедините их

CREATE TABLE clients (
    id INTEGER,
    name TEXT
);

CREATE TABLE orders (
    id INTEGER,
    client_id INTEGER,
    amount INTEGER
);

INSERT INTO clients (id, name) VALUES
(1, 'Анна'),
(2, 'Илья'),
(3, 'Мария');

INSERT INTO orders (id, client_id, amount) VALUES
(1, 1, 1200),
(2, 1, 2400),
(3, 2, 900);

SELECT clients.name, orders.amount
FROM clients
JOIN orders ON orders.client_id = clients.id;

В результате Анна появится два раза, потому что у нее два заказа. Мария не появится, потому что у нее нет заказов. Затем замените JOIN на LEFT JOIN и сравните результат

Частые ошибки

Первая ошибка — забыть условие ON. Тогда база может получить декартово произведение: каждая строка одной таблицы соединится с каждой строкой другой

Вторая ошибка — соединять таблицы по похожим, но не связанным полям. Например, по имени клиента вместо идентификатора. Имена могут повторяться, а идентификаторы обычно уникальны

Третья ошибка — не понимать, почему строки дублируются. Если у одного клиента несколько заказов, клиент будет повторяться в результате. Это не ошибка JOIN, а отражение связи «один ко многим»

Что почитать дальше по SQL

Если нужен общий маршрут по теме, откройте рубрику SQL. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x