Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
17 Апр 2023
10 мин
64703

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

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

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

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

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

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

Чтобы разобраться в основах SQL, записывайтесь на курс
«Аналитик данных». Вы научитесь делать таблицы и составлять запросы для анализа. Узнаете, как соединять и обрабатывать несколько таблиц, использовать оконные функции.

Предположим, что у нас есть таблица заказов — 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

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

Если хотите разобраться в нюансах join в SQL, приходите на курс
«Программирование для анализа данных». Вы узнаете, как работать с базами данных и таблицами: создавать их, объединять и обрабатывать. Выполните практические задания и получите ответы на вопросы от наставников.

Пример использования 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 Редиска Менеджмент Пётр Петров

Запрос:

&amp;lt;/p&amp;gt;
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, понять, как делать запросы и составлять таблицы, приходите на курс «Аналитик данных». Под руководством наставников вы попрактикуетесь в решении разных задач и сможете профессионально работать с одним из самых популярных языков запросов.

Учтите, что в одном запросе нельзя дважды использовать имя одной и той же таблицы: иначе запрос вернет ошибку. Поэтому, чтобы выполнить соединение таблицы 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 &lt;&gt; 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 &lt;&gt; 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: учим с азов, ведем до диплома и помогаем найти работу.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий