В реляционных базах данных информация хранится в виде набора связанных таблиц. Чтобы извлекать из них осмысленные данные, необходимо уметь их соединять. Для этого в 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.
ON, которое определяет, как связаны строки.customer AS c) является хорошей практикой, которая улучшает читаемость запросов.JOIN не изменяет исходные данные, а лишь создает временный результирующий набор строк.В следующих уроках мы подробно разберем различные типы соединений (INNER JOIN, LEFT JOIN, RIGHT JOIN) и увидим, как они влияют на итоговый результат.