JOIN в SQL простыми словами: INNER и LEFT JOIN с примерами
· 4 мин чтения СтатьяSQL

JOIN в SQL простыми словами: INNER и LEFT JOIN с примерами

Как соединить две таблицы в SQL: чем INNER JOIN отличается от LEFT JOIN, зачем условие ON и три ошибки, из-за которых соединение тихо врёт.

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

Зачем вообще две таблицы

Можно было бы писать имя покупателя прямо в каждый заказ. Но у одного человека десятки заказов, и при смене фамилии пришлось бы править их все. Поэтому данные раскладывают по таблицам, а связь держат ключом: в заказе хранится только customer_id. Цена такого порядка — чтобы увидеть имя рядом с заказом, таблицы приходится соединять.

INNER JOIN: только пары

Самое частое соединение — внутреннее. Оно оставляет строки, у которых нашлась пара в обеих таблицах:

SELECT c.name, o.order_date, o.status
FROM customers c
JOIN orders o ON o.customer_id = c.id;

Слово INNER можно не писать: просто JOIN — это и есть внутреннее соединение. Покупатель без единого заказа в такой выдаче не появится вовсе, и это важно помнить: отчёт «все покупатели и их заказы» через INNER JOIN молча теряет людей.

LEFT JOIN: все из левой таблицы

Если нужны все покупатели, даже без заказов, берут левое соединение. Оно оставляет каждую строку левой таблицы, а там, где пары нет, подставляет в колонки правой пустоту — NULL:

SELECT c.name, o.id AS order_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

Отсюда удобный приём: найти тех, у кого нет ни одного заказа, — дописать WHERE o.id IS NULL. Строки без пары как раз и отличаются пустым ключом справа.

Условие ON: по какому столбцу сшивать

После ON пишут, какие значения должны совпасть: номер покупателя в заказе и номер самого покупателя. Короткие имена таблиц — c и o — это псевдонимы: без них пришлось бы писать customers.id и orders.customer_id полностью.

Три ошибки, из-за которых соединение врёт

  • Забыли ON. Тогда каждая строка одной таблицы соединится с каждой строкой другой: десять покупателей и сорок заказов дадут четыреста строк.
  • Условие на правую таблицу в WHERE. LEFT JOIN … WHERE o.status = 'доставлен' выбросит покупателей без заказов — у них status пустой, и условие не проходит. Если нужны все покупатели, условие переносят в ON.
  • Сумма после соединения. Когда к одной строке приезжает несколько парных, значения из неё повторяются, и SUM считает их по нескольку раз. Проверка простая: сравнить число строк до соединения и после.

Где потренироваться

Соединения быстрее всего укладываются в руках, а не в голове. В тренажёре SQL запросы проверяются на той же учебной базе магазина, а в курсе SQL с нуля соединениям отведены отдельные уроки — от первого JOIN до поиска строк без пары. Начать можно с урока про WHERE: условия отбора пригодятся в каждом соединении. Если нужно посчитать итоги по соединённым таблицам, пригодится разбор GROUP BY и HAVING.

Тренажёр SQL Запросы с проверкой на учебной базе — прямо в браузере, без установки.
Открыть тренажёр

Ещё в блоге

Новый курс Как выучить немецкий с нуля: курс со звуком — от чтения до первых разговоров Правила чтения, sein и знакомство, der, die, das, порядок слов, числа и время, винительный падеж, модальные глаголы и Perfekt. Каждую фразу можно послушать. · 3 мин чтения Новый курс Git без страха: бесплатный курс с погружением в коммиты, ветки и работу в команде Коммиты и хорошие сообщения, история и откат, ветки, слияние и конфликты, пулл-реквесты и ревью, командные правила и спасение из типичных бед. Бесплатно. · 3 мин чтения Новый курс Как продавать на Wildberries и не уйти в минус: бесплатный курс с погружением для продавцов Юнит-экономика до первой поставки, выбор товара, документы и маркировка, карточка и поиск, остатки, цена, реклама, отзывы и цифры кабинета. Бесплатно. · 3 мин чтения СтатьяExcel Как протянуть формулу в Excel и почему она не протягивается Как протянуть формулу на весь столбец за секунду, почему во всех ячейках один результат, почему ссылка «уехала» и что делать с формулой, которая стала текстом. · 4 мин чтения