Зачем нужны JOIN (повторение реляционной модели)
Повторите реляционную модель, нормализованные таблицы и внешние ключи, а также узнайте, почему JOIN — это мост, собирающий данные из разных таблиц
«Зачем нужны JOIN (повторение реляционной модели)» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Нормализация на одном примере
Вместо дублирования данных разделите их между таблицами:
users— идентификатор, имя, электронная почтаorders— идентификатор, идентификатор пользователя, сумма
Каждый заказ ссылается на пользователя по идентификатору, а не хранит его имя и электронную почту повторно.
Зачем нужна нормализация
Преимущества:
- Нет дублирования — электронную почту пользователя нужно менять только в одном месте
- Меньшие таблицы — выше вероятность попадания в кэш
- Ограничения обеспечивают соблюдение связей
Внешние ключи определяют связь
Связь объявляется с помощью FOREIGN KEY:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
total NUMERIC(10,2) NOT NULL
);Восстановление данных с помощью JOIN
Чтобы показать «имя пользователя для каждого заказа», снова объедините таблицы с помощью JOIN:
SELECT o.id, o.total, u.full_name, u.email
FROM orders o
JOIN users u ON u.id = o.user_id
ORDER BY o.id;Ментальная модель: отфильтрованное декартово произведение
Концептуально JOIN выполняет следующее:
- Формирует декартово произведение двух таблиц — каждую строку A объединяет с каждой строкой B
- Оставляет только пары, для которых условие ON равно TRUE
На практике база данных использует соединение по хешу, слиянием или вложенными циклами, но результат остается тем же.
Один ко многим
У одного пользователя может быть много заказов. Сторона «многие» содержит внешний ключ.
-- Each order row points back to its user:
SELECT u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email;Многие ко многим через связующую таблицу
Теги ↔ публикации: добавьте третью таблицу:
CREATE TABLE posts (id BIGSERIAL PRIMARY KEY, title TEXT);
CREATE TABLE tags (id BIGSERIAL PRIMARY KEY, name TEXT);
CREATE TABLE post_tags (
post_id BIGINT REFERENCES posts(id),
tag_id BIGINT REFERENCES tags(id),
PRIMARY KEY (post_id, tag_id)
);Запросы для связи многие ко многим
Два соединения, чтобы объединить все данные:
SELECT p.title, t.name
FROM posts p
JOIN post_tags pt ON pt.post_id = p.id
JOIN tags t ON t.id = pt.tag_id
WHERE t.name = 'sql';Когда нужна денормализация
Денормализацию, то есть дублирование данных, иногда используют для повышения производительности: например, для кэширования вычисленных итогов, хранения столбцов полнотекстового поиска и материализованных представлений. Начинайте с нормализованной структуры, а денормализацию применяйте после измерения производительности.
Соединения и подзапросы
Многие запросы с JOIN можно записать с помощью подзапросов и наоборот. Используйте тот вариант, который легче читать: современные планировщики часто создают для них один и тот же план.
Внешние ключи не обеспечиваются автоматически
Их необходимо объявить с помощью REFERENCES. Даже при наличии ограничений FK индексирование столбца FK — это YOUR задача: создайте индекс явно для повышения производительности соединений.
Итоги
Соединения восстанавливают данные, разделенные между таблицами для обеспечения целостности.
- Внешние ключи объявляют связь
- JOIN отменяет нормализацию во время выполнения запроса
- Связь один ко многим создается через FK на стороне «многие», а связь многие ко многим — через связующую таблицу
Быстрая проверка
В связи один ко многим между users и orders какая таблица содержит столбец внешнего ключа?
Часто задаваемые вопросы
Урок «Зачем нужны JOIN (повторение реляционной модели)» бесплатный?
Да — полный текст урока «Зачем нужны JOIN (повторение реляционной модели)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Зачем нужны JOIN (повторение реляционной модели)»?
Повторите реляционную модель, нормализованные таблицы и внешние ключи, а также узнайте, почему JOIN — это мост, собирающий данные из разных таблиц Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Зачем нужны JOIN (повторение реляционной модели)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны JOIN (повторение реляционной модели)
- Механика INNER JOIN
- LEFT/RIGHT JOIN и внешние соединения
- Самосоединения и псевдонимы