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

Типы соединения таблиц SQL: Join

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

В этом уроке мы изучим, какие бывают виды соединений и сравним их между собой.

Пять типов соединения таблиц

В языке SQL есть пять видов инструкции JOIN — типов соединения таблиц:

  1. CROSS JOIN
  2. INNER JOIN
  3. LEFT JOIN или LEFT OUTER JOIN
  4. RIGHT JOIN или RIGHT OUTER JOIN
  5. FULL JOIN или FULL OUTER JOIN

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

Разберем обе ситуации, а также каждый тип подробнее.

Соединение без условия

cross-join

В эту группу попадает только CROSS JOIN — это соединение строит все возможные комбинации строк из двух таблиц.

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

SELECT
    color_name,
    material_name
FROM colors
CROSS JOIN materials;

View on DBfiddle

Соединения с условием

condition-joins

В эту группу попадают остальные типы: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN. В их случаях в результат попадают не все сочетания, а только те, которые удовлетворяют специальному условию соединения.

Рассмотрим пример. Допустим, у нас есть две таблицы:

  • authors (author_id, author_name) — информация об авторах
  • books (book_id, book_author_id, title) — информация о книгах

View on DBfiddle

Если мы хотим получить список книг с именами их авторов, то нам нужны не все возможные сочетания авторов и книг, а только те, в которых автор один и тот же: authors.author_id = books.book_author_id. Это равенство и будет условием соединения таблиц.

Выбор типа соединения с условием

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

Допустим, что у нас могут быть авторы без книг, то есть в таблице books нет строк с такими значениями author_id. Условие соединения authors.author_id = books.book_author_id не выполнится для таких авторов.

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

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

Виды соединений

тип соединения валидные пары строки без пары из TableA строки без пары из TableB
TableA INNER JOIN TableB добавляются не добавляются не добавляются
TableA LEFT JOIN TableB добавляются добавляются не добавляются
TableA RIGHT JOIN TableB добавляются не добавляются добавляются
TableA FULL JOIN TableB добавляются добавляются добавляются

По правилам SQL, строки без пары добавляются в результат всего один раз, а вместо недостающих значений устанавливается NULL.

INNER JOIN

inner-join

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

SELECT
    author_name,
    title
FROM books
INNER JOIN authors ON book_author_id = author_id;

View on DBFiddle

LEFT JOIN

left-join

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

SELECT
    dep.name AS department,
    emp.name AS employee
FROM departments AS dep
LEFT JOIN employees AS emp ON
    dep.department_id = emp.department_id;

View on DB Fiddle

RIGHT JOIN

right-join

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

SELECT
    dep.name as department,
    emp.name as employee
FROM departments AS dep
RIGHT JOIN employees AS emp ON
    dep.department_id = emp.department_id;

View on DB Fiddle

FULL JOIN

full-join

Полное внешнее соединение используют, когда в результате должны быть все строки из обеих таблиц, даже если у них нет подходящей пары. Результат FULL JOIN включает в себя результаты INNER JOIN, LEFT JOIN и RIGHT JOIN.

SELECT
    dep.name as department,
    emp.name as employee
FROM departments AS dep
FULL JOIN employees AS emp ON
    dep.department_id = emp.department_id;

View on DB Fiddle

Выводы

Соединения позволяют связать данные из двух таблиц. В языке SQL есть несколько разновидностей соединений:

  • CROSS JOIN — это соединение без условия, оно возвращает все возможные сочетания строк из двух таблиц.
  • INNER JOIN — это соединение возвращает только те пары строк, которые удовлетворяют специальному условию.
  • LEFT JOIN, RIGHT JOIN, FULL JOIN — это соединения, которые добавляют к результату INNER JOIN строки без пары

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

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

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

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

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

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

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

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