0Pricing
SQL Academy · Урок

Зачем нужны 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 выполняет следующее:

  1. Формирует декартово произведение двух таблиц — каждую строку A объединяет с каждой строкой B
  2. Оставляет только пары, для которых условие 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 — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужны JOIN (повторение реляционной модели)
  2. Механика INNER JOIN
  3. LEFT/RIGHT JOIN и внешние соединения
  4. Самосоединения и псевдонимы
← Назад к SQL Academy