0Pricing
SQL Interview Prep · Урок

Как INNER JOIN сопоставляет строки

Мысленная модель объединения пар строк, которая упрощает любой вопрос о JOIN.

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

Первый JOIN на собеседовании

Когда интервьюер говорит «соедините эти две таблицы», почти всегда имеется в виду INNER JOIN. Это соединение по умолчанию, которое показывает, действительно ли вы понимаете, как строки образуют пары.

Всю тему можно свести к одному предложению: INNER JOIN рассматривает каждую возможную пару строк из двух таблиц и оставляет только пары, удовлетворяющие условию ON. Если совпадения нет, строка просто исчезает из результата.

Закрепите эту мысленную модель, и каждый более сложный вопрос о соединениях станет проще.

Две таблицы для анализа

На протяжении всего урока мы используем две небольшие таблицы. customers содержит сведения о тех, кто размещал заказы, а orders хранит данные о каждом заказе и клиенте, которому он принадлежит.

  • customers(id, name)
  • orders(id, customer_id, amount)

Связь между ними задаётся выражением orders.customer_id = customers.id. Это равенство является предикатом соединения, от которого зависит весь результат.

customers
id | name
1  | Ada
2  | Bob
3  | Cleo   -- no orders yet

orders
id | customer_id | amount
10 | 1           | 50
11 | 1           | 20
12 | 2           | 99

Базовый запрос с INNER JOIN

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

Ключевое слово INNER необязательно во всех основных СУБД. Запись без уточнения JOIN означает INNER JOIN, но явное указание типа соединения подчёркивает намерение и устраняет неоднозначность при проверке кода.

SELECT c.name, o.amount
FROM customers AS c
INNER JOIN orders AS o
  ON o.customer_id = c.id;

Как выглядит результат

Выполнив запрос для наших примеров данных, вы получите три строки. У Ada два заказа, поэтому она появится дважды. Bob появится один раз.

Cleo исчезла. У неё нет подходящего заказа, поэтому INNER JOIN полностью исключает её из результата. На собеседовании о соединениях особенно важно прямо сказать, что несовпавшие строки исчезают.

name | amount
Ada  | 50
Ada  | 20
Bob  | 99

Модель сопоставления строк

Представьте, что база данных сначала формирует декартово произведение: каждого клиента объединяет с каждым заказом. При 3 клиентах и 3 заказах получится 9 возможных пар.

Затем она применяет предикат ON и оставляет только пары, для которых он истинен. Из 9 возможных пар условию o.customer_id = c.id соответствуют только 3.

Так не рассуждают о производительности, но это точная модель, позволяющая ответить на любой вопрос о том, «сколько строк вернётся?»

Разбор возможных пар

Разберём это по шагам. Комментарий после каждой пары показывает, истинно ли условие.

В результате остаются только три строки со значением TRUE. Все пары с участием Cleo (id 3) не проходят условие, поэтому она ничего не добавляет в результат.

-- customer.id vs order.customer_id
(Ada=1, ord10 cust=1)  -> TRUE  keep
(Ada=1, ord11 cust=1)  -> TRUE  keep
(Ada=1, ord12 cust=2)  -> FALSE
(Bob=2, ord10 cust=1)  -> FALSE
(Bob=2, ord12 cust=2)  -> TRUE  keep
(Cleo=3, anything)     -> FALSE (no order matches 3)

INNER JOIN не зависит от порядка

Распространённый вопрос: имеет ли значение, какую таблицу указать первой? Для INNER JOIN нет. Эти два запроса возвращают одинаковые строки, потому что условие ON симметрично.

Оптимизатор может читать первой любую таблицу, независимо от того, как записан запрос. (Для соединений LEFT/RIGHT это NOT так; к ним мы перейдём позже.)

-- These return the same rows
SELECT c.name, o.amount
FROM customers c JOIN orders o ON o.customer_id = c.id;

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

Ожидаются псевдонимы таблиц

Интервьюеры ожидают короткие и понятные псевдонимы. Сравните подробный полностью квалифицированный вариант с чистым вариантом с псевдонимами.

Псевдонимы также становятся обязательными, когда имя столбца встречается в обеих таблицах. Выбор обычного id здесь вызовет ошибку неоднозначного столбца, поэтому необходимо написать c.id или o.id.

-- verbose
SELECT customers.name, orders.amount
FROM customers JOIN orders
  ON orders.customer_id = customers.id;

-- aliased, preferred
SELECT c.name, o.amount
FROM customers c JOIN orders o
  ON o.customer_id = c.id;

Соединение по нескольким столбцам

Предикат ON не ограничивается одним равенством. Когда связь определяется составным ключом, объедините условия с помощью AND.

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

SELECT s.units, p.unit_price
FROM sales s
INNER JOIN price_list p
  ON p.product_id = s.product_id
 AND p.region     = s.region;

Существуют и неэквисоединения

Условием ON может быть любое логическое выражение, а не только =. Неэквисоединение использует диапазоны или неравенства. Классический пример — отнесение оценки к диапазону оценок.

Каждая оценка сопоставляется с единственным диапазоном, который её содержит. Упоминание о том, что соединения не ограничиваются равенством, — быстрый способ показать себя опытным разработчиком.

SELECT s.student, g.grade
FROM scores s
INNER JOIN grades g
  ON s.points >= g.min_points
 AND s.points <= g.max_points;

Явный JOIN и соединение через запятую

Старый синтаксис соединения через запятую всё ещё встречается в унаследованном коде и некоторых вопросах на собеседованиях. Для INNER JOIN эти два запроса эквивалентны.

Предпочитайте явную форму JOIN ... ON. Синтаксис с запятой легко случайно превратить в декартово произведение, забыв WHERE, — именно такую ошибку интервьюеры и надеются обнаружить.

-- old implicit join
SELECT c.name, o.amount
FROM customers c, orders o
WHERE o.customer_id = c.id;

-- modern explicit join (preferred)
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id;

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

Проверьте основную идею сопоставления в INNER JOIN.

Повторение: как сопоставляет INNER JOIN

Основные мысли, которые стоит повторить на собеседовании:

  • INNER JOIN оставляет только совпадающие пары; несопоставленные строки с обеих сторон исчезают.
  • Мысленная модель: сформируйте все возможные пары, затем оставьте те, для которых предикат ON истинен.
  • Результат не зависит от порядка, а ключевое слово INNER необязательно.
  • ON может использовать составные ключи, диапазоны и неравенства, а не только одинарное =.
  • Используйте явную конструкцию JOIN ... ON с понятными псевдонимами, чтобы избежать ошибок из-за неоднозначных столбцов и случайного декартова произведения.

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

Урок «Как INNER JOIN сопоставляет строки» бесплатный?

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

Чему я научусь в уроке «Как INNER JOIN сопоставляет строки»?

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

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

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

Сколько времени занимает урок «Как INNER JOIN сопоставляет строки»?

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

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

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

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

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