img
img
09 июня 2022
14 июня 2022
8 мин
84

Что такое join в SQL и как с ним работать

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

img

SQL — Simple Query Language, то есть «простой язык запросов». Его создали, чтобы работать с реляционными базами данных. В таких базах данные представлены в виде таблиц. Зависимости между несколькими таблицами задают с помощью связующих — реляционных столбцов. 

Когда запрашиваем данные из одной таблицы, работа со связующими столбцами не нужна. Но если нужно агрегировать данные из нескольких, стоит описать правила: как будут связаны строки на основе значений связующих столбцов. Тогда на помощь и приходит оператор join.

Что такое оператор join в SQL

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

Предположим, что у нас есть таблица заказов — Orders:

OrderID CustomerID OrderDate
304101 21 10-05-2021
304102 34 20-06-2021
304103 22 25-07-2021

И таблица клиентов — Customers:

CustomerID CustomerName ContactName
21 Балалайка Сервис Иван Иванов
22 Рога и копыта Семён Семёнов
23 Редиска Менеджмент Пётр Петров

Столбец CustomerID в таблице заказов соотносится со столбцом CustomerID в таблице клиентов. То есть он — связующий двух таблиц. Чтобы узнать, когда, какой клиент и какой заказ оформил, составьте запрос:


SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate 

FROM Orders 

JOIN Customers 

ON Orders.CustomerID=Customers.CustomerID;

Результат запроса будет выглядеть так:

OrderID CustomerName OrderDate
304101 Балалайка Сервис 10-05-2021
304103 Редиска Менеджмент 25-07-2021

Общий синтаксис оператора join:

JOIN <Название таблицы для присоединения> ON <Условие присоединения на основе связующих столбцов>

Соединять можно и больше двух таблиц: к запросу добавьте еще один оператор join. Например, в дополнение к предыдущим двум таблицам у нас есть таблица продавцов — Managers:

OrderID ManagerName ContactDate
304101 Артём Лапин 05-05-2021
304102 Егор Орлов 15-06-2021
304103 Евгений Соколов 20-07-2021

Таблица продавцов связана с таблицей заказов столбцом OrderID. Чтобы в дополнение к предыдущему запросу узнать, какой продавец обслуживал заказ, составьте следующий запрос:


SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate, Managers.ManagerName 

FROM Orders 

JOIN Customers 

ON Orders.CustomerID=Customers.CustomerID 

JOIN Managers 

ON Orders.OrderId=Managers.OrderId

Результат:

OrderID CustomerName OrderDate ManagerName
304101 Балалайка Сервис 10-05-2021 Артём Лапин
304103 Редиска Менеджмент 25-07-2021 Евгений Соколов

Внутреннее соединение INNER JOIN

Если использовать оператор INNER JOIN, в результат запроса попадут только те записи, для которых выполняется условие объединения. Еще одно условие — записи должны быть в обеих таблицах. В финальный результат из примера выше не попали записи с CustomerID=23 и OrderID=304102: для них нет соответствия в таблицах.

Общий синтаксис запроса INNER JOIN:


SELECT column_name(s)

FROM table1

INNER JOIN table2

ON table1.column_name = table2.column_name;

Пример работы внутреннего соединения

Иллюстрация работы INNER JOIN

Слово INNER в запросе можно опускать, тогда общий синтаксис запроса будет выглядеть так:


SELECT column_name(s)

FROM table1

INNER JOIN table2

ON table1.column_name = table2.column_name;

Внешние соединения OUTER JOIN

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

Указание таблицы, из которой нужно выбрать все записи без фильтрации, называется направлением соединения.

LEFT OUTER JOIN / LEFT JOIN

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

Пример работы LEFT JOIN

Иллюстрация работы LEFT JOIN

Синтаксис:


SELECT column_name(s)

FROM table1

LEFT JOIN table2

ON table1.column_name = table2.column_name;

Пример:

Таблица Orders:

OrderID CustomerID OrderDate
304101 21 10-05-2021
304102 34 20-06-2021
304103 22 25-07-2021

Таблица Customers:

CustomerID CustomerName ContactName
21 Балалайка Сервис Иван Иванов
22 Рога и копыта Семён Семёнов
23 Редиска Менеджмент Пётр Петров

Запрос:


SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate 

FROM Orders 

LEFT JOIN Customers 

ON Orders.CustomerID=Customers.CustomerID;

Результат:

OrderID CustomerName OrderDate
304101 Балалайка Сервис 10-05-2021
304102 null 20-06-2021
304103 Редиска Менеджмент 25-07-2021

RIGHT OUTER JOIN / RIGHT JOIN

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

Пример использования RIGHT JOIN

Иллюстрация работы RIGHT JOIN

Синтаксис:


SELECT column_name(s)

FROM table1

RIGHT JOIN table2

ON table1.column_name = table2.column_name;

Пример:

Таблица Orders:

OrderID CustomerID OrderDate
304101 21 10-05-2021
304102 34 20-06-2021
304103 22 25-07-2021

Таблица Customers:

CustomerID CustomerName ContactName
21 Балалайка Сервис Иван Иванов
22 Рога и копыта Семён Семёнов
23 Редиска Менеджмент Пётр Петров

Запрос:


SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate 

FROM Orders 

RIGHT JOIN Customers 

ON Orders.CustomerID=Customers.CustomerID;

Результат:

OrderID CustomerName OrderDate
304101 Балалайка Сервис 10-05-2021
null Рога и копыта null
304103 Редиска Менеджмент 25-07-2021

FULL OUTER JOIN / FULL JOIN

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

Пример использования FULL FOIN

Иллюстрация работы FULL JOIN

Синтаксис:


SELECT column_name(s)

FROM table1

FULL JOIN table2

ON table1.column_name = table2.column_name;

Пример:

Таблица Orders

OrderID CustomerID OrderDate
304101 21 10-05-2021
304102 34 20-06-2021
304103 22 25-07-2021

Таблица Customers:

CustomerID CustomerName ContactName
21 Балалайка Сервис Иван Иванов
22 Рога и копыта Семён Семёнов
23 Редиска Менеджмент Пётр Петров

Запрос:


SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate 

FROM Orders 

FULL JOIN Customers 

ON Orders.CustomerID=Customers.CustomerID;

Результат:

OrderID CustomerName OrderDate
304101 Балалайка Сервис 10-05-2021
304102 null 20-06-2021
304103 Редиска Менеджмент 25-07-2021
null Рога и копыта null

Перекрестное соединение CROSS JOIN

Этот оператор отличается от предыдущих операторов соединения: ему не нужно задавать условие объединения (ON table1.column_name = table2.column_name). Записи в таблице с результатами — это результат объединения каждой записи из левой таблицы с записями из правой. Такое действие называют декартовым произведением. 

Пример работы CROSS JOIN

Иллюстрация работы CROSS JOIN

Синтаксис:


SELECT column_name(s)

FROM table1

CROSS JOIN table2;

Пример:

Таблица Orders:

OrderID CustomerID OrderDate
304101 21 10-05-2021
304102 34 20-06-2021
304103 22 25-07-2021

Таблица Customers:

CustomerID CustomerName ContactName
21 Балалайка Сервис Иван Иванов
22 Рога и копыта Семён Семёнов
23 Редиска Менеджмент Пётр Петров

Запрос:


SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate 

FROM Orders 

CROSS JOIN Customers;

Результат:

OrderID CustomerName OrderDate
304101 Балалайка Сервис 10-05-2021
304101 Рога и копыта 10-05-2021
304101 Редиска Менеджмент 10-05-2021
304102 Балалайка Сервис 20-06-2021
304102 Рога и копыта 20-06-2021
304102 Редиска Менеджмент 20-06-2021
304103 Балалайка Сервис 25-07-2021
304103 Рога и копыта 25-07-2021
304103 Редиска Менеджмент 25-07-2021

Соединение SELF JOIN

Его используют, когда в запросе нужно соединить несколько записей из одной и той же таблицы. 

В SQL нет отдельного оператора, чтобы описать SELF JOIN соединения. Поэтому, чтобы описать соединения данных из одной и той же таблицы, воспользуйтесь операторами JOIN или WHERE. 

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

Синтаксис соединения SELF JOIN при использовании оператора JOIN:


SELECT column_name(s)

FROM table1 a1

JOIN table1 a2

ON a1.column_name = a2.column_name;

Оператор JOIN может быть любым: используйте LEFT JOIN, RIGHT JOIN. Результат будет таким же, как когда объединяли две разные таблицы.

Синтаксис соединения SELF JOIN при использовании оператора WHERE:


SELECT column_name(s)

FROM table1 a1, table1 a2

WHERE a1.common_col_name = a2.common_col_name;

Пример:

Талица Students:

StudentID Name CourseID Duration
1 Артём 1 3
2 Пётр 2 4
1 Артём 2 4
3 Борис 3 2
2 Ирина 3 5

Запрос с оператором WHERE:


SELECT  s1.StudentID, s1.Name

FROM Students AS s1, Students s2

WHERE s1.StudentID = s2.StudentID

AND s1.CourseID <> s2.CourseID;

Результат:

StudentID Name
1 Артём
2 Ирина
1 Артём
2 Пётр

Запрос с оператором JOIN:


SELECT  s1.StudentID, s1.Name

FROM Students s1

JOIN Students s2

ON s1.StudentID = s2.StudentID

AND s1.CourseID <> s2.CourseID

GROUP BY StudentID;

Результат:

StudentID Name
1 Артём
2 Ирина

Главное о join в SQL

  • В SQL используют операторы соединения join, чтобы объединять данные из нескольких таблиц. Когда результат должен содержать только данные двух таблиц с общим ключом, применяют INNER JOIN или просто JOIN.
  • Если нужен полный список записей одной из таблиц, объединенных с данными из другой, используют операторы LEFT и RIGHT JOIN.
  • Если результат должен содержать полный список записей обеих таблиц, где некоторые записи объединены, применяют оператор FULL JOIN.
  • Если нужно декартово произведение двух таблиц, используют оператор CROSS JOIN. Хотите соединить данные из одной и той же таблицы между собой — нужен SELF JOIN.

Научитесь писать SQL-запросы на курсе «Аналитик данных» Skypro. Изучите агрегатные функции, подзапросы и WITH, JOIN, оконные функции и многое другое, а еще — решите бизнес-задачу с помощью SQL. 

Еще в программе: базовые формулы Excel, работа в Power Pivot и Power Query, Python для анализа данных. Справитесь и без опыта в IT: учим с азов, ведем до диплома и помогаем найти работу.

img
Подпишитесь на рассылку, чтобы Не упустить что-нибудь новое
Просто и понятно о том, как получить новую профессию


    Дадим нужные знания и поможем получить работу!
    Регистрируйтесь на курс и учитесь у экспертов-практиков.
    Профессия
    за 10 месяцев
    Аналитик данных
    • Справитесь без опыта в IT — учим с азов
    • В рассрочку на 36 месяцев
    • Всего 10 часов в неделю
    3 020 ₽/мес
    Ещё по теме
    SQL-запросы: базовые команды и примеры

    Чтобы создать таблицу, используют команду CREATE TABLE, новую запись — INSERT.

    14 июня 2022
    6 мин
    Словарь аналитика данных, или Как выбрать чайник

    Разбираем, что такое пул, фича, дашборд и другие термины.

    09 июня 2022
    3 мин
    Обзор лучших сервисов для анализа маркетплейсов

    Анализируем SellerFox, MPStats, Shopstat, PI-Data и еще шесть сервисов.

    17 мая 2022
    8 мин
    Юнит-экономика: что это такое и как ее рассчитать

    С помощью unit-экономики прогнозируют доход, находят точки роста.

    16 апреля 2022
    9 мин
    Как работать с формулами в Excel

    Формулы в Excel делятся на простые, сложные и комбинированные.

    13 апреля 2022
    7 мин
    Кто такой менеджер по продукту, чем он занимается и как им стать

    Product manager отвечает за все стадии работы над продуктом.

    03 марта 2022
    9 мин
    Что такое когортный анализ: для чего и где применять, как проводить исследование

    В когорту входят пользователи, совершившие одинаковое действие в одно время.

    02 марта 2022
    7 мин
    Что такое дашборд и как его создать

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

    24 февраля 2022
    11 мин
    Кто такой аналитик и как им стать

    Аналитик нужен в любой сфере, где систематизируют и исследуют большие данные.

    24 февраля 2022
    12 мин
    kralbetbetturkeyikimislibahis1xbetm.infohipas.infohttps://www.wiibet.com/restbetcdn.com
    Вставить формулу как
    Блок
    Строка
    Дополнительные настройки
    Цвет формулы
    Цвет текста
    #333333
    Используйте LaTeX для набора формулы
    Предпросмотр
    \({}\)
    Формула не набрана
    Вставить