Раздел 42 · Аналитика данных с нуля

INNER JOIN: склеиваем таблицы по ключу

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Мира · маркетолог магазина настолок «Кубик»

Спасибо за схему! Но мне нужна нормальная выгрузка: кто заказал, какие игры, почём. И главное: какие жанры приносят больше денег? Хочу понять, что рекламировать.

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

Карточки на скрепке

Представь две стопки карточек: заказы и клиенты. Берёшь заказ, смотришь номер клиента, ищешь в стопке клиентов карточку с этим номером и скрепляешь их скрепкой. Получилась одна длинная карточка: заказ плюс его клиент. Повторяешь для каждого заказа.

Это и есть соединение. Скрепляем только пары, у которых совпал номер, а правило совпадения пишем в ON.

Первый JOIN

SELECT o.id AS order_id,
       c.name,
       c.city,
       o.status
FROM orders o
JOIN customers c ON c.id = o.customer_id
ORDER BY o.id
LIMIT 3;
 order_id | name           | city            | status
----------+----------------+-----------------+-----------
        1 | Кирилл Волков  | Санкт-Петербург | delivered
        2 | Елена Тихонова | Казань          | delivered
        3 | Ольга Комарова | Москва          | delivered

Разберём по частям:

  • FROM orders o и JOIN customers c: две таблицы и их короткие имена. Псевдоним o значит «заказы», c значит «клиенты»;
  • ON c.id = o.customer_id: правило скрепки, тот самый внешний ключ из прошлого урока;
  • o.id, c.name: префикс говорит, из какой таблицы столбец.

Префикс нужен не для красоты. Столбец id есть в обеих таблицах, и без префикса база ответит column reference "id" is ambiguous: какой из двух id ты имел в виду?

JOIN без уточнений означает INNER JOIN, внутреннее соединение. Оно оставляет только строки, у которых нашлась пара. У каждого заказа клиент есть, поэтому строк столько же, сколько заказов, 6555.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.