0Pricing
Coding Interview Prep · Урок

Объединение трёх и более таблиц

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

«Объединение трёх и более таблиц» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

Соединения образуют цепочку, а не ветвятся

Реальные задачи на собеседованиях редко ограничиваются двумя таблицами. Вас попросят соединить три, четыре или больше таблиц. Главная мысль, которая упрощает задачу: соединение нескольких таблиц — это просто последовательность соединений двух таблиц.

База данных соединяет первые две таблицы в промежуточный результат, затем соединяет этот результат с третьей таблицей и так далее. Если Вы умеете рассуждать об одном соединении, то сможете рассуждать и о целой цепочке соединений.

Схема из трёх таблиц

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

  • customers(id, name)
  • orders(id, customer_id, product_id, amount)
  • products(id, title)

Их соединяют две связи: orders.customer_id = customers.id и orders.product_id = products.id.

customers(id, name)
orders(id, customer_id, product_id, amount)
products(id, title)

Базовый запрос к трём таблицам

Последовательно добавляйте соединения. Каждый JOIN ... ON добавляет таблицу и указывает, как она связана с предыдущим результатом.

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

SELECT c.name, p.title, o.amount
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products  p ON p.id = o.product_id;

Мысленно представляйте промежуточные результаты

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

  • После первого соединения: столбцы заказов и клиента.
  • После второго соединения: этот результат и столбцы товаров.

Следующее условие ON может ссылаться на любой столбец, уже присутствующий в промежуточном наборе, поэтому порядок соединений влияет на то, что можно записать в каждом ON.

Каждое ON видит предыдущие таблицы

Важное следствие: условие ON последующего соединения может ссылаться на любую таблицу, присоединённую до него, а не только на добавляемую таблицу.

Здесь третье соединение ссылается на o (заказы), который уже доступен в текущей области видимости. Вы также могли бы связать четвёртую таблицу с c или p, поскольку обе уже входят в текущий результат.

SELECT c.name, p.title, w.region
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products  p ON p.id = o.product_id
JOIN warehouses w ON w.id = o.warehouse_id; -- refers to o

Начинайте с центральной таблицы

Практический совет для технических собеседований: начинайте предложение FROM с таблицы фактов / центральной таблицы — обычно это таблица, находящаяся в центре связей, — а затем двигайтесь наружу к таблицам-справочникам.

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

-- orders is central: it links to both sides
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products  p ON p.id = o.product_id

Размножение строк накапливается в цепочках

Всё, чему вы научились о размножении строк, по-прежнему применимо, и этот эффект накапливается. Если у каждого заказа много позиций, а у каждой позиции много записей о налогах, количество строк умножается на каждом шаге.

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

-- rows = orders * items_per_order * tax_rows_per_item
SELECT o.id
FROM orders o
JOIN order_items i ON i.order_id = o.id
JOIN item_taxes  t ON t.item_id  = i.id;

Смешивание типов соединений в цепочке

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

Здесь, если у клиента нет заказа, LEFT JOIN сохранит его со значением NULL в идентификаторе товара, а следующее INNER JOIN с таблицей товаров снова исключит его — это легко упустить под давлением.

SELECT c.name, p.title
FROM customers c
LEFT JOIN orders  o ON o.customer_id = c.id
JOIN products p ON p.id = o.product_id;
-- the INNER products join can cancel the LEFT JOIN

Сохраняйте внешние соединения внешними

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

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

SELECT c.name, p.title
FROM customers c
LEFT JOIN orders   o ON o.customer_id = c.id
LEFT JOIN products p ON p.id = o.product_id;
-- customers with no orders are now kept (NULL title)

Псевдонимы необходимы при масштабировании

В таблицах из четырёх или пяти источников несколько таблиц могут иметь одинаковые имена столбцов, например id, name или created_at. Короткие и последовательные псевдонимы устраняют неоднозначность и делают запрос понятнее.

Выбирайте псевдонимы, напоминающие название таблицы (c, o, p), и указывайте, к какой таблице относится каждый столбец. По вашим псевдонимам интервьюеры судят о том, как вы пишете рабочие запросы.

SELECT c.id   AS customer_id,
       o.id   AS order_id,
       p.id   AS product_id,
       p.title
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products  p ON p.id = o.product_id;

Промежуточные таблицы для связей многие-ко-многим

Когда две сущности связаны отношением многие-ко-многим, между ними находится третья соединительная (промежуточная) таблица, и соединение выполняется через неё. Студенты и курсы связаны через записи о зачислении.

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

SELECT s.name, c.title
FROM students s
JOIN enrollments e ON e.student_id = s.id
JOIN courses     c ON c.id = e.course_id;

Быстрая проверка

Рассуждайте о цепочке со смешанными соединениями.

Повторение: соединение трёх и более таблиц

Запомните это для собеседования:

  • Соединение нескольких таблиц — это цепочка соединений двух таблиц; рассуждайте о промежуточном результате после каждого шага.
  • Последующее условие ON может ссылаться на любую предыдущую таблицу в цепочке.
  • Начинайте с центральной таблицы и двигайтесь к таблицам-справочникам.
  • Размножение строк накапливается при соединениях; проверяйте уровень детализации на каждом шаге.
  • INNER JOIN после LEFT JOIN может свести его эффект на нет; продолжайте использовать внешние соединения, чтобы сохранить необязательные строки.
  • Связи многие-ко-многим соединяются через промежуточную таблицу.

Часто задаваемые вопросы

Урок «Объединение трёх и более таблиц» бесплатный?

Да — полный текст урока «Объединение трёх и более таблиц» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Объединение трёх и более таблиц»?

Объединяйте таблицы цепочкой и рассуждайте о промежуточных наборах результатов. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Объединение трёх и более таблиц»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Как INNER JOIN сопоставляет строки
  2. ON и WHERE в объединениях
  3. Размножение строк при JOIN
  4. Объединение трёх и более таблиц
← Назад к Coding Interview Prep