Урок 5.1 · Время чтения: ~8 мин
SQL JOIN объединяет строки из двух и более таблиц по связанному столбцу. В этом уроке вы узнаете основную концепцию JOIN, научитесь писать условие ON, поймёте, зачем использовать псевдонимы таблиц, и на практических примерах базы данных Sakila научитесь извлекать связанные данные шаг за шагом.
В реляционных базах данных информация хранится в виде набора связанных таблиц. Чтобы извлекать из них осмысленные данные, необходимо уметь их соединять. Для этого в SQL используется операция JOIN. Она позволяет объединять строки из двух или более таблиц на основе связанных столбцов.
Этот урок закладывает фундамент для понимания JOIN как ключевой концепции для работы с реляционными данными.
JOIN — это механизм, который позволяет комбинировать строки из разных таблиц в один результирующий набор. Соединение происходит по условию, которое чаще всего сравнивает значения в столбцах-ключах.
Представьте две таблицы: customer (клиенты) и payment (платежи). В таблице payment есть столбец customer_id, который указывает, какой клиент совершил платеж. JOIN позволяет "склеить" строки из этих двух таблиц, чтобы для каждого платежа видеть не просто ID клиента, а его имя и фамилию.
Как это работает:
ON, например, customer.customer_id = payment.customer_id.Визуализация:
Таблица A (customer) Таблица B (payment)
+----+-------+ +----+----------+
| id | name | | id | amount |
+----+-------+ +----+----------+
| 1 | Ivan | <-----\ | 1 | 100.00 |
| 2 | Maria | \--->| 1 | 50.00 |
| 3 | Petr | | 3 | 200.00 |
+----+-------+ +----+----------+
Стрелки показывают, как строки из таблицы payment находят "своего" клиента в таблице customer по совпадающему id.
Давайте рассмотрим, как это выглядит в реальном SQL-запросе на примере базы данных Sakila.
Получение списка клиентов и их платежей:
Этот запрос соединяет таблицы customer и payment, чтобы рядом с каждым платежом показать имя и фамилию клиента.
SELECT
c.first_name,
c.last_name,
p.amount,
p.payment_date
FROM
customer AS c
JOIN
payment AS p ON c.customer_id = p.customer_id;
JOIN payment AS p указывает, что мы присоединяем таблицу payment.ON c.customer_id = p.customer_id — это условие, по которому строки считаются связанными.c и p — это алиасы (псевдонимы), которые делают запрос короче и читабельнее.Получение списка фильмов и их языка:
Соединим таблицы film и language, чтобы показать название каждого фильма и язык, на котором он представлен.
SELECT
f.title,
l.name AS language
FROM
film AS f
JOIN
language AS l ON f.language_id = l.language_id;
Здесь связь установлена по ключу language_id.
Ключевые выводы урока:
customer AS c) укорачивают запросы и делают их понятнее.JOIN не изменяет исходные данные; он создаёт временный результирующий набор.INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN.→ Урок 5.2: INNER JOIN — Соединение совпадающих строк
В SQL просто JOIN — это сокращение для INNER JOIN. Оба варианта дают одинаковый результат. Явное INNER JOIN чаще предпочтительнее, особенно когда в одном запросе используются разные типы соединений.
Если ни одна строка не удовлетворяет условию ON, INNER JOIN вернёт пустой результат. Ошибки не возникнет — запрос просто вернёт ноль строк. Другие типы соединений (LEFT JOIN и др.) обрабатывают несовпадающие строки иначе.
Да. Можно цепочкой писать несколько JOIN в одном запросе, каждый со своим условием ON. База данных обрабатывает их последовательно, накапливая результирующий набор.
JOIN — это как поиск связанной информации по общему ID в двух электронных таблицах. Если в одной таблице список клиентов с ID, а в другой — список платежей с ID клиента, JOIN позволяет видеть рядом с каждым платежом имя клиента, а не просто его ID — без дублирования данных.
Условие ON определяет, какие строки считаются соответствующими. Без него база данных сформирует декартово произведение — каждая строка первой таблицы с каждой строкой второй, что редко полезно и потенциально очень большо.
Псевдонимы устраняют неоднозначность, когда две таблицы содержат одинаковые названия столбцов (например, id). С псевдонимами можно писать c.id и p.id, что сразу понятно и читателю, и базе данных.