Зарегистрируйтесь, чтобы продолжить обучение

Объединение нескольких таблиц Аналитика на SQL

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

В таких случаях аналитики используют оператор JOIN — один из ключевых инструментов для объединения таблиц в SQL. Именно его мы изучим в этом уроке.

Оператор JOIN

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

В SQL есть несколько видов объединений. Для наглядности возьмем таблицы, которые мы планируем объединить и представим в виде фигур на листе бумаги. В таком случае все виды объединений можно графически изобразить так:

Untitled

На схеме выше мы видим четыре оператора, которые используются для объединения данных разными способами:

  1. INNER JOIN — возвращает строки, которые имеют совпадения в обеих таблицах по заданным условиям. Это самый распространенный тип объединения
  2. LEFT JOIN или LEFT OUTER JOIN — возвращает все строки из левой таблицы, а также соответствующие строки из правой таблицы по заданным условиям. Если в правой таблице нет соответствующих строк, то в результате будут отображаться NULL-значения. Это аналогично области левой таблицы
  3. RIGHT JOIN или RIGHT OUTER JOIN — возвращает все строки из правой таблицы, а также соответствующие строки из левой таблицы по заданным условиям. Если в левой таблице нет соответствующих строк, то в результирующем наборе будут отображаться NULL-значения. Это аналогично области правой таблицы
  4. FULL JOIN или FULL OUTER JOIN — возвращает все строки из обеих таблиц и соответствующие строки по заданным условиям. Если в одной из таблиц нет соответствующих строк, то в результирующем наборе будут отображаться NULL-значения.

Синтаксис объединений и INNER JOIN

Итак, для объединения данных из разных таблиц мы будем использовать операторы объединений:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL JOIN

Синтаксис объединений в SQL выглядит так:

SELECT <название_колонки>
FROM <таблица1>
INNER JOIN <таблица2>
    ON <условия_объединения>;

В этом запросе после оператора FROM мы указываем название левой таблицы — то есть той таблицы, к которой присоединяем данные. После INNER JOIN указываем название правой таблицы — то есть присоединяемой таблицы. В качестве условий объединения указываем показатели, которые связывают обе эти таблицы.

Для примера возьмем нашу базу данных, в которую мы добавили новую таблицу orders.

Таблица customers

customers

Tаблица orders

orders

Выполним следующий запрос:

SELECT
    customers.customer_name,
    orders.order_date
FROM customers
INNER JOIN orders
    ON customers.customer_id = orders.customer_id;

Итоговая таблица будет выглядеть так:

join result

Этот запрос соединяет таблицы customers и orders с помощью INNER JOIN. Оператор INNER JOIN возвращает только те строки, где значения в столбце customer_id совпадают в обеих таблицах.

В результате этого запроса получим:

  • Имена клиентов — customer_name
  • Даты заказов — order_date

Эти данные мы получим только для тех заказов, которые имеют соответствующие значения customer_id в обеих таблицах.

Иными словами, мы получим список имен клиентов и дат заказов для существующих связей между клиентами и заказами. Это помогает нам проанализировать поведение клиентов.

Допишем в этот запрос оператор AND после ON. Таким образом мы добавим дополнительное условие для объединения таблиц. Оно должно выполняться одновременно с условием объединения таблиц в операторе ON:

SELECT
    customers.customer_name,
    orders.order_date
FROM customers
INNER JOIN orders
    ON
        customers.customer_id = orders.customer_id
        AND orders.order_date > '2023-01-02';

Мы получим:

Untitled

В этом случае мы:

  • Проверяем равенство customer_id в таблицах customers и orders
  • Добавляем условие orders.order_date > '2023-01-02' с помощью оператора AND

Таким образом, запрос вернет имена клиентов customer_name и даты заказов order_date после указанной даты.

С помощью оператора AND можно добавить дополнительные условия для фильтрации данных при объединении таблиц — и таким образом получить более точный и специфический результат.

Отношения в таблицах

В SQL существуют три основных типа связей между таблицами:

  • «Один-ко-многим» (One-to-Many)
  • «Один-к-одному» (One-to-One)
  • «Многие–ко–многим» (Many-to-Many)

Умение отличать эти связи друг от друга помогает правильно использовать оператор JOIN при объединении таблиц в SQL.

Для начала рассмотрим самый распространенный тип связи — «Один-ко-многим» (One-to-Many). При таком типе связи одна запись в одной таблице связана с несколькими записями в другой таблице.

Например, у нас на складе есть десять ноутбуков одной и той же модели. Если мы продадим все ноутбуки разным людям, то эта модель будет входить в десять разных заказов.

Это означает, что каждая запись в таблице products может быть связана с несколькими записями в таблице sales.

Посмотрим на примере такого запроса:

SELECT
    products.product_name,
    sales.quantity
FROM products
INNER JOIN sales
    ON products.product_id = sales.product_id;

Выполнив этот запрос, мы увидим список товаров и количество продаж:

Untitled

Рассмотрим еще один вид связи — «Один-к-одному» (One-to-One). При такой связи каждая запись в одной таблице имеет только одну связанную запись в другой таблице.

Например, каждый клиент в таблице customers может иметь только один заказ в таблице orders. Пример SQL-запроса с такой связью выглядит так:

SELECT
    customers.customer_id,
    customers.customer_name,
    orders.order_id,
    orders.order_date
FROM customers
INNER JOIN orders
    ON customers.customer_id = orders.customer_id;

И вот такой результат мы получим:

Untitled

Рассмотрим третий вид связи — «Многие–ко–многим» (Many-to-Many). Этот тип связи возникает, когда множество записей в одной таблице связано с множеством записей в другой таблице. Для реализации такой связи нужна таблица-связь — это вспомогательная таблица, которая содержит связи между записями из обеих таблиц.

Рассмотрим эту связь в наших данных. Именно таким образом связаны товары и магазины — ведь множество товаров может быть связано с множеством магазинов. Для этого используется таблица-связь sales, которая содержит информацию о связи между продуктами и магазинами.

SQL-запрос может выглядеть так:

SELECT
    products.product_id,
    products.product_name,
    sales.sale_id,
    sales.quantity,
    stores.store_name
FROM products
INNER JOIN sales ON products.product_id = sales.product_id
INNER JOIN stores ON sales.store_id = stores.store_id;

Такой результат мы получим при выполнении этого запроса:

Untitled

Выводы

Сделаем краткие выводы:

  • Чтобы работать с аналитическими запросами в SQL, часто нужно объединять данные из нескольких таблиц
  • Оператор JOIN позволяет объединять строки из разных таблиц на основе заданных условий связи
  • В SQL существуют различные типы объединений — INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN
  • Связь «Один-ко-многим» (One-to-Many) означает, что одна запись в одной таблице может быть связана с несколькими записями в другой таблице
  • Связь «Один-к-одному» (One-to-One) означает, что каждая запись в одной таблице имеет только одну связанную запись в другой таблице
  • Связь «Многие–ко–многим» (Many-to-Many) означает, что каждая запись в одной таблице может быть связана с несколькими записями в другой таблице, и наоборот. Для реализации такой связи используется дополнительная таблица-связка

В следующем уроке мы продолжим изучать разные способы объединения нескольких таблиц.

Примечание

Вы можете подключиться к базе из лекции как:

  • Host 65.108.223.44
  • Database webinarsdb
  • Login student
  • Password student

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff