Немного о JOIN в SQL
Для специалистов, которые работают с базами данных (БД), JOIN — не просто оператор объединения таблиц SQL. Это незаменимый помощник, который позволяет эффективно выбирать данные из разных таблиц и объединять их в один результирующий набор.
JOIN помогает выполнять сложные запросы так, чтобы сведения фильтровались, сортировались и проходили агрегацию. Вот почему JOIN — неотъемлемая часть работы с реляционными БД, в которых информация разбросана по разным таблицам.
JOIN помогает выполнять сложные запросы так, чтобы сведения фильтровались, сортировались и проходили агрегацию. Вот почему JOIN — неотъемлемая часть работы с реляционными БД, в которых информация разбросана по разным таблицам.
Синтаксис оператора JOIN
Для работы с JOIN важно понимать, как выглядит его синтаксис:
SELECT
t1.column_name,
t2.column_name
FROM
table_name1 as t1
[join_type] JOIN table_name2 as t2 ON join_condition;
В первой части команды: SELECT table_nameN.column_name, ... на месте многоточия можно указать любое количество столбцов формата table_nameN.column_name, которое вам необходимо задействовать.
Чтобы запрос был успешно выполнен, во второй части
FROM
table_name1 as t1
[join_type] JOIN table_name2 as t2 ON join_condition;
необходимо учесть следующие элементы:
- имя первой таблицы для объединения;
- тип используемого JOIN;
- имя второй таблицы для объединения;
- правило объединения — логическое выражение или ключ.
Для чего нужен JOIN в SQL
- Чтобы извлекать данные из связанных таблиц — когда нужно объединить информацию в единый набор результатов для анализа или составления отчета.
- Выявить связи между таблицами по ключам и использовать их для извлечения данных.
- Чтобы отфильтровать информацию и извлечь только те данные, которые соответствуют конкретному запросу.
- Упростить процесс поиска и анализа данных, распределенных по многочисленным таблицам.
Как работает JOIN
JOIN — своего рода фильтр поиска, который сокращает количество запросов к БД и повышает производительность при обработке больших объемов информации. Такой же фильтр, как в каком-нибудь интернет-магазине. Когда, например, мы ищем одежду и задаем в параметрах поиска определенный размер или цвет. В выдаче результатов мы увидим товары, соответствующие выбранным критериям.
Говоря о JOIN, важно упомянуть, что существуют различные связи между таблицами, которые создаются при помощи внешних ключей. Другими словами, это указатели на строки других таблиц. Выделяют следующие виды связей:
Для наглядности возьмем три таблицы: Student (данные студентов), StudentCourse (выбранные студентами курсы) и Course (описание курсов).
Говоря о JOIN, важно упомянуть, что существуют различные связи между таблицами, которые создаются при помощи внешних ключей. Другими словами, это указатели на строки других таблиц. Выделяют следующие виды связей:
- 1:1 (один к одному) — подразумевает под собой связь между данными из двух таблиц, допустим, A и B, где строка из таблицы A будет иметь только одно совпадающее значение в B.
- 1:m (один к многим) — этот вид считают наиболее распространенным, он предполагает, что строка из таблицы A может иметь несколько совпадающих строк в B. При этом у строки из таблицы B будет только одно совпадающее значение в А.
- m:m (многие ко многим) — при таком виде связи строка из таблицы A будет иметь несколько совпадающих строк в таблице B. И наоборот.
Для наглядности возьмем три таблицы: Student (данные студентов), StudentCourse (выбранные студентами курсы) и Course (описание курсов).
Таблица 1: Student
ROLL_NO | NAME | ADDRESS | PHONE | AGE | |
---|---|---|---|---|---|
1 | Иван | Москва | 276476 | 19 | |
2 | Настя | Санкт-Петербург | 241242 | 20 | |
3 | Катя | Волгоград | 214536 | 18 | |
4 | Стас | Рязань | 455253 | 22 |
Таблица 2: StudentCourse
COURSE_ID | ROLL_NO |
---|---|
1 | 1 |
2 | 2 |
2 | 3 |
3 | 4 |
Таблица 3: Course
COURSE_ID | NAME | DESCRIPTION |
---|---|---|
1 | Обучение Python | Основы языка Python |
2 | Обучение Java | Основы языка Java |
3 | Обучение SQL | Основы языка SQL |
У этих таблиц есть общий ключ — столбец ROLL_NO и COURSE_ID. Чтобы узнать, на каком курсе учатся студенты, потребуется такой SQL-запрос:
SELECT
s.ROLL_NO,
s.NAME,
s.ADDRESS,
s.PHONE,
s.AGE,
sc.COURSE_ID,
c.NAME as COURSE_NAME,
FROM
Student s
JOIN StudentCourse sc ON s.roll_no = sc.roll_no
JOIN Course c ON c.course_id = sc.course_id;
И вот какой результат мы получим в итоге:
ROLL_NO | NAME | ADDRESS | PHONE | AGE | COURSE_ID | COURSE_NAME |
---|---|---|---|---|---|---|
1 | Иван | Москва | 276476 | 19 | 1 | Обучение Python |
2 | Настя | Санкт-Петербург | 241242 | 20 | 2 | Обучение Java |
3 | Катя | Волгоград | 214536 | 18 | 2 | Обучение Java |
4 | Стас | Рязань | 455253 | 22 | 3 | Обучение SQL |
Кому пригодится оператор JOIN
Всем, кто планирует работать с реляционными базами данных и SQL, знание JOIN необходимо. Например, специалисты финансовых учреждений успешно применяют JOIN, чтобы связать информацию о клиентах и их транзакциях. Это помогает выявлять потенциальные случаи мошенничества.
Розничным компаниям JOIN также необходим для эффективного анализа данных о продажах и запасах. С его помощью можно оптимизировать планы поставок и управлять складскими запасами.
Однако JOIN принесет пользу и другим специалистам: сотрудникам техподдержки, контент-менеджерам, SEO-специалистам и разработчикам. С ним можно облегчить процесс обработки и анализа данных.
Розничным компаниям JOIN также необходим для эффективного анализа данных о продажах и запасах. С его помощью можно оптимизировать планы поставок и управлять складскими запасами.
Однако JOIN принесет пользу и другим специалистам: сотрудникам техподдержки, контент-менеджерам, SEO-специалистам и разработчикам. С ним можно облегчить процесс обработки и анализа данных.
Виды JOIN в SQL
На первый взгляд работа с JOIN кажется простой, но у оператора есть большое количество разновидностей, каждый из которых выполняет свою функцию. И в них нужно тщательно разбираться.
Как только вы определили цель запроса, важно подобрать соответствующий вариант оператора. Выделяют четыре основных типа JOIN: INNER, OUTER (LEFT, RIGHT и FULL), CROSS и SELF. Разберемся, как устроен каждый из них.
Как только вы определили цель запроса, важно подобрать соответствующий вариант оператора. Выделяют четыре основных типа JOIN: INNER, OUTER (LEFT, RIGHT и FULL), CROSS и SELF. Разберемся, как устроен каждый из них.
INNER JOIN
Рисунок 1. INNER JOIN
Этот тип называют «прямым соединением». Его используют чаще остальных. Если вы, к примеру, не укажете тип JOIN в своем запросе, то он будет использован автоматически.
Благодаря INNER JOIN можно объединять данные из нескольких таблиц на основе заданного условия соединения. Причем для всех пар связанных строк оно должно быть выполнено. В результате объединения в новой таблице будут отражены только строки с совпадающими значениями в двух столбцах, которые указаны в условии (ON).
Рассмотрим вариант синтаксиса INNER JOIN:
Благодаря INNER JOIN можно объединять данные из нескольких таблиц на основе заданного условия соединения. Причем для всех пар связанных строк оно должно быть выполнено. В результате объединения в новой таблице будут отражены только строки с совпадающими значениями в двух столбцах, которые указаны в условии (ON).
Рассмотрим вариант синтаксиса INNER JOIN:
SELECT
a.id as address_id,
u.full_name,
u.enabled as user_enabled,
u.last_login,
u.id as user_id,
a.street,
a.city
FROM
users as u
INNER JOIN addresses as a ON u.id = a.user_id
Попробуем объединить с использованием INNER JOIN таблицы Users и Addresses.
Таблица 1: Users
id | full_name | enabled | last_login |
---|---|---|---|
1 | Иван Иванов | false | 2024-07-11 15:25:15:103846 |
2 | Дарья Васильева | true | 2024-07-11 15:26:12:344844 |
3 | Петр Петров | true | 2024-07-11 15:23:16:734629 |
5 | Ольга Семенова | true | 2024-07-11 15:29:17:572936 |
Таблица 2: Addresses
id | user_id | street | city | active | |
---|---|---|---|---|---|
1 | 1 | Авиамоторная | Москва | true | |
2 | 2 | Гончарная | Санкт-Петербург | true | |
3 | 3 | Краснознаменная | Саратов | true | |
4 | 2 | Чапаева | Новосибирск | false |
И вот что получим после выполнения команды INNER JOIN:
address_id | full_name | user_enabled | last_login | user_id | street | city |
---|---|---|---|---|---|---|
1 | Иван Иванов | false | 2024-07-11 15:25:15:103846 | 1 | Авиамоторная | Москва |
2 | Дарья Васильева | true | 2024-07-11 15:26:12:344844 | 2 | Гончарная | Санкт-Петербург |
3 | Петр Петров | true | 2024-07-11 15:23:16:734629 | 3 | Краснознаменная | Саратов |
4 | Дарья Васильева | false | 2024-07-11 15:26:12:344844 | 2 | Чапаева | Новосибирск |
В случае с INNER JOIN стоит помнить, что не соответствующие строки не отобразятся в результате запроса.
Для этого вида JOIN необходимо правильно определить правила, по которым будут объединяться таблицы. Так вы сможете избежать ошибок и получите точные результаты.
Для этого вида JOIN необходимо правильно определить правила, по которым будут объединяться таблицы. Так вы сможете избежать ошибок и получите точные результаты.
OUTER JOIN
OUTER JOIN в SQL — его еще называют внешним соединением. Оно возвращает строки из нескольких таблиц в различных вариациях в зависимости от типа. В OUTER JOIN возможны три варианта объединений: LEFT JOIN, RIGHT JOIN и FULL JOIN.
Рисунок 2. LEFT JOIN
LEFT JOIN возвращает все строки из левой таблицы, указанной в условии — ON, и только те строки из правой таблицы, для которых выполняется условие соединения. При отсутствии совпадений запрос вернет значения NULL для этих столбцов.
Рассмотрим принцип работы на примере выборки из таблиц Users и Addresses, что приводили выше.
Рассмотрим принцип работы на примере выборки из таблиц Users и Addresses, что приводили выше.
Таблица 1: Users
id | full_name | enabled | last_login |
---|---|---|---|
1 | Иван Иванов | false | 2024-07-11 15:25:15:103846 |
2 | Дарья Васильева | true | 2024-07-11 15:26:12:344844 |
3 | Петр Петров | true | 2024-07-11 15:23:16:734629 |
5 | Ольга Семенова | true | 2024-07-11 15:29:17:572936 |
Таблица 2: Addresses
id | user_id | street | city | active | |
---|---|---|---|---|---|
1 | 1 | Авиамоторная | Москва | true | |
2 | 2 | Гончарная | Санкт-Петербург | true | |
3 | 3 | Краснознаменная | Саратов | true | |
4 | 2 | Чапаева | Новосибирск | false |
Запрос в SQL с использованием LEFT JOIN выглядит следующим образом:
SELECT
u.id as user_id,
u.full_name,
u.enabled as user_enabled,
u.last_login,
a.id as address_id,
a.street,
a.city
FROM
users as u
LEFT JOIN addresses as a ON user.id = addresses.user_id;
Таким образом, главная таблица будет располагаться слева. И вот результат:
user_id | full_name | user_enabled | last_login | address_id | street | city |
---|---|---|---|---|---|---|
1 | Иван Иванов | f | 2024-07-11 15:25:15:103846 | 1 | Авиамоторная | Москва |
2 | Дарья Васильева | t | 2024-07-11 15:26:12:344844 | 2 | Гончарная | Санкт-Петербург |
3 | Петр Петров | t | 2024-07-11 15:23:16:734629 | 3 | Краснознаменная | Саратов |
5 | Ольга Семенова | t | 2024-07-11 15:29:17:572936 | null | null | null |
Так как адреса пользователя Ольги Семеновой нет в таблице Addresses, на выходе запрос вернул значения NULL.
В запросе можно прописывать как LEFT JOIN, так и LEFT OUTER JOIN — результат от этого не изменится. Для удобства использования команды OUTER часть опускают.
В запросе можно прописывать как LEFT JOIN, так и LEFT OUTER JOIN — результат от этого не изменится. Для удобства использования команды OUTER часть опускают.
Рисунок 3. RIGHT JOIN
RIGHT JOIN работает по аналогии с LEFT. Только возвращает все строки из правой таблицы, которая указана в условии — ON, и те строки из левой таблицы, для которых выполнено условие соединения. Если в левой таблице не окажется совпадающих значений, то в результате они отобразятся как NULL.
Рассмотрим пример RIGHT JOIN на тех же таблицах.
Рассмотрим пример RIGHT JOIN на тех же таблицах.
Таблица 1: Users
id | full_name | enabled | last_login |
---|---|---|---|
1 | Иван Иванов | false | 2024-07-11 15:25:15:103846 |
2 | Дарья Васильева | true | 2024-07-11 15:26:12:344844 |
3 | Петр Петров | true | 2024-07-11 15:23:16:734629 |
5 | Ольга Семенова | true | 2024-07-11 15:29:17:572936 |
Таблица 2: Addresses
id | user_id | street | city | active | |
---|---|---|---|---|---|
1 | 1 | Авиамоторная | Москва | true | |
2 | 2 | Гончарная | Санкт-Петербург | true | |
3 | 3 | Краснознаменная | Саратов | true | |
4 | 2 | Чапаева | Новосибирск | false |
Вот как будет выглядеть запрос в SQL с RIGHT JOIN:
SELECT
u.id as user_id,
u.full_name,
u.enabled as user_enabled,
u.last_login,
a.id as address_id,
a.street,
a.city
FROM
addresses a
RIGHT JOIN users u ON u.id = a.user_id;
В данном случае главная таблица в результате будет справа.
user_id | full_name | user_enabled | last_login | address_id | street | city |
---|---|---|---|---|---|---|
1 | Иван Иванов | false | 2024-07-11 15:25:15:103846 | 1 | Авиамоторная | Москва |
2 | Дарья Васильева | true | 2024-07-11 15:26:12:344844 | 2 | Гончарная | Санкт-Петербург |
3 | Петр Петров | true | 2024-07-11 15:23:16:734629 | 3 | Краснознаменная | Саратов |
5 | Ольга Семенова | true | 2024-07-11 15:29:17:572936 | null | null | null |
Рисунок 4. FULL JOIN
FULL JOIN — комбинация LEFT и RIGHT JOIN. Этот тип возвращает все строки из обеих таблиц, независимо от того, есть ли соответствующие значения. При отсутствии совпадений в обеих таблицах, оператор вернет значения NULL для этих столбцов. Другими словами, это объединение всех столбцов двух таблиц. Если условие объединения выполнено, строки объединяются, как и в предыдущих примерах, которые мы разбирали.
OUTER JOIN полезен, когда необходимо объединить данные из нескольких таблиц и включить в результат все строки, даже если нет полного совпадения между ними.
OUTER JOIN полезен, когда необходимо объединить данные из нескольких таблиц и включить в результат все строки, даже если нет полного совпадения между ними.
CROSS JOIN
Рисунок 5. CROSS JOIN (Источник: javatpoint.com)
CROSS — возвращает все возможные комбинации строк из таблиц, которые объединяются. Это единственный тип JOIN, который не нуждается в условии соединения (ON).
CROSS JOIN не так часто используют. Этот оператор будет полезен в нескольких случаях:
CROSS JOIN не так часто используют. Этот оператор будет полезен в нескольких случаях:
- Когда необходимо проанализировать многочисленные комбинации значений из нескольких таблиц. Например, если вы планируете проанализировать продажи товаров, CROSS JOIN поможет создать таблицу со всеми возможными комбинациями товаров и клиентов.
- Когда нужно произвести вычисления или отфильтровать данные на основе всех возможных комбинаций значений.
SELECT
u.id as user_id,
u.full_name,
u.enabled as user_enabled,
u.last_login,
a.id as address_id,
a.street,
a.city
FROM
users u,
addresses a;
Возможен и второй вариант синтаксиса CROSS JOIN:
SELECT
u.id as user_id,
u.full_name,
u.enabled as user_enabled,
u.last_login,
a.id as address_id,
a.street,
a.city
FROM
users u
CROSS JOIN addresses a;
А в результате SQL-запроса получится подобная таблица:
user_id | full_name | user_enabled | last_login | address_id | street | city |
---|---|---|---|---|---|---|
1 | Иван Иванов | false | 2024-07-11 15:25:15:103846 | 1 | Авиамоторная | Москва |
2 | Дарья Васильева | true | 2024-07-11 15:26:12:344844 | 1 | Авиамоторная | Москва |
3 | Петр Петров | true | 2024-07-11 15:23:16:734629 | 1 | Авиамоторная | Москва |
5 | Ольга Семенова | true | 2024-07-11 15:29:17:572936 | 1 | Авиамоторная | Москва |
1 | Иван Иванов | false | 2024-07-11 15:25:15:103846 | 2 | Гончарная | Санкт-Петербург |
2 | Дарья Васильева | true | 2024-07-11 15:26:12:344844 | 2 | Гончарная | Санкт-Петербург |
3 | Петр Петров | true | 2024-07-11 15:23:16:734629 | 2 | Гончарная | Санкт-Петербург |
5 | Ольга Семенова | true | 2024-07-11 15:29:17:572936 | 2 | Гончарная | Санкт-Петербург |
1 | Иван Иванов | false | 2024-07-11 15:25:15:103846 | 3 | Краснознаменная | Саратов |
2 | Дарья Васильева | true | 2024-07-11 15:26:12:344844 | 3 | Краснознаменная | Саратов |
3 | Петр Петров | true | 2024-07-11 15:23:16:734629 | 3 | Краснознаменная | Саратов |
5 | Ольга Семенова | true | 2024-07-11 15:29:17:572936 | 3 | Краснознаменная | Саратов |
SELF JOIN
Рисунок 6: SELF JOIN ( Источник: stratascratch.com)
SELF JOIN — самостоятельное соединение, которое позволяет объединять строки из одной таблицы на основе конкретных условий. С ним легко работать и извлекать информацию, сравнивая записи в одной таблице.
Подведем итоги
Мы выяснили, что JOIN в SQL — операция, которая позволяет объединять данные из разных таблиц по определенному условию.
В основе JOIN лежит концепция связей между таблицами. В зависимости от того, какую задачу необходимо выполнить, можно использовать различные виды JOIN-операторов: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN или SELF JOIN. Каждый из них обладает определенным способом соединения, о которых рассказали подробно выше. Если после прочтения материала у вас остались вопросы о принципах работы JOIN в SQL, можете подтянуть текущие знания или освоить SQL с нуля на курсе от ProductStar — SQL для анализа данных. С его помощью вы научитесь работать с базами данных, повысите уровень своих компетенций и станете конкурентоспособным специалистом на рынке.
В основе JOIN лежит концепция связей между таблицами. В зависимости от того, какую задачу необходимо выполнить, можно использовать различные виды JOIN-операторов: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, CROSS JOIN или SELF JOIN. Каждый из них обладает определенным способом соединения, о которых рассказали подробно выше. Если после прочтения материала у вас остались вопросы о принципах работы JOIN в SQL, можете подтянуть текущие знания или освоить SQL с нуля на курсе от ProductStar — SQL для анализа данных. С его помощью вы научитесь работать с базами данных, повысите уровень своих компетенций и станете конкурентоспособным специалистом на рынке.
Статья написана при участии эксперта — Виктора Гладких, тимлида backend-разработки РБК Pro