Механика INNER JOIN
Поймите INNER JOIN как отфильтрованное декартово произведение, научитесь задавать условия соединения и читать вывод EXPLAIN для соединений
«Механика INNER JOIN» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Соединение INNER JOIN
INNER JOIN возвращает только строки, для которых существует соответствующая пара в BOTH таблицах, согласно условию ON.
Базовое соединение INNER JOIN
Получение каждого заказа вместе с его пользователем:
SELECT o.id, o.total, u.email
FROM orders o
INNER JOIN users u ON u.id = o.user_id;
-- INNER is the default — you can also write:
SELECT o.id, o.total, u.email
FROM orders o
JOIN users u ON u.id = o.user_id;Несколько условий в ON
Условие ON — это обычное логическое выражение:
SELECT *
FROM events e
JOIN sessions s
ON s.user_id = e.user_id
AND e.created_at BETWEEN s.start_at AND s.end_at;Псевдонимы
Псевдонимы сокращают запросы и устраняют неоднозначность ссылок на столбцы:
SELECT o.id, u.email
FROM orders AS o -- AS is optional
JOIN users AS u ON u.id = o.user_id;Соединение трех и более таблиц
Объединяйте таблицы в цепочку, повторяя предложение JOIN:
SELECT o.id, u.email, p.name AS product
FROM orders o
JOIN users u ON u.id = o.user_id
JOIN products p ON p.id = o.product_id;USING (столбец)
Если столбец для соединения имеет одинаковое имя в обеих таблицах, можно использовать USING — он устраняет дублирование этого столбца в результате:
SELECT o.id, total, email
FROM orders
JOIN users USING (user_id); -- requires both tables to have user_idNATURAL JOIN
Соединяет таблицы по каждому столбцу с одинаковым именем — будьте осторожны: такой запрос легко нарушить добавлением новых столбцов.
-- Avoid in production code:
SELECT * FROM orders NATURAL JOIN users;Условия JOIN и WHERE
Для INNER JOIN условие в ON логически эквивалентно такому же условию в WHERE. Принято помещать в ON условия, определяющие связь JOIN, а в WHERE — фильтры строк.
SELECT * FROM orders o
JOIN users u ON u.id = o.user_id -- join condition
WHERE u.country = 'US'; -- row filterРазмножение результатов
Если строка в A соответствует трем строкам в B, результат содержит три строки. Это нормально, но может удивить, если забыть об этом. Выполняете агрегацию? Осторожно используйте COUNT(*).
Предварительный обзор самосоединения
Таблицу можно соединить с самой собой, задав для каждого экземпляра отдельный псевдоним:
SELECT e.full_name AS employee, m.full_name AS manager
FROM employees e
JOIN employees m ON m.id = e.manager_id;Производительность INNER JOIN
Внутренние соединения работают быстро, когда:
- Столбец соединения проиндексирован, особенно на стороне FK
- Одна таблица небольшая, что позволяет использовать соединение по хешу, или обе таблицы отсортированы, что позволяет использовать соединение слиянием
- Фильтрация выполняется рано, чтобы уменьшить количество промежуточных строк
Итоги
INNER JOIN оставляет только соответствующие пары.
- JOIN по умолчанию означает INNER JOIN
- ON задает условие соединения
- Псевдонимы делают запросы короче
- Столбцы соединения должны быть проиндексированы
Быстрая проверка
Что вернет orders INNER JOIN users ON users.id = orders.user_id, если для заказа нет соответствующего пользователя, то есть заказ является осиротевшим?
Часто задаваемые вопросы
Урок «Механика INNER JOIN» бесплатный?
Да — полный текст урока «Механика INNER JOIN» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Механика INNER JOIN»?
Поймите INNER JOIN как отфильтрованное декартово произведение, научитесь задавать условия соединения и читать вывод EXPLAIN для соединений Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Механика INNER JOIN»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны JOIN (повторение реляционной модели)
- Механика INNER JOIN
- LEFT/RIGHT JOIN и внешние соединения
- Самосоединения и псевдонимы