JavaRush /Курсы /SQL SELF /Основы INNER JOIN

Основы INNER JOIN

SQL SELF
11 уровень , 1 лекция
Открыта

На прошлой лекции мы обсудили, какие типы JOIN бывают в SQL. Сегодня мы подробнее остановимся на INNER JOIN.

INNER JOIN — это тип объединения данных в реляционных базах, который позволяет взять строки из двух таблиц и вернуть только те строки, которые "совпадают" согласно определённому вами условию. То есть, INNER JOIN возвращает только пересекающиеся части двух таблиц, игнорируя все остальное.

Давайте представим, что у вас есть две коробки. В одной лежат карточки со студентами, а в другой — карточки с курсами, на которые зарегистрированы студенты. Вы хотите узнать, какие студенты записаны на какие курсы. Если нет совпадения (например, студент никуда не записан), эти данные нас пока не интересуют. Такой сценарий идеально подходит для INNER JOIN.

Синтаксис INNER JOIN

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

SELECT столбцы
FROM таблица1 INNER JOIN таблица2
ON таблица1.поле = таблица2.поле;
  • таблица1 и таблица2 — это таблицы, которые вы хотите объединить.
  • поле — это столбцы, по которым идет сопоставление.
  • Условие после ON указывает правила сопоставления строк из обеих таблиц.

Примеры использования INNER JOIN

Для дальнейших примеров мы будем работать с двумя таблицами:

Таблица students — данные о студентах

student_id name age
1 Otto 20
2 Anna 22
3 Peter 19
4 Dia 21

Таблица enrollments — данные о записях на курсы

enrollment_id student_id course_id
101 1 501
102 2 502
103 2 503
104 3 504

Заметьте, что студент Dia (с student_id = 4) не зарегистрирована ни на один курс.

Пример 1: Получение записей о студентах и их курсах

Мы хотим узнать, какие студенты записаны на курсы. Это типичный пример использования INNER JOIN. Нам важно только то, где есть совпадение данных между таблицами students и enrollments на основе student_id.

SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;

Результат:

name course_id
Otto 501
Anna 502
Anna 503
Peter 504

Что мы видим? INNER JOIN вернул только тех студентов, которые зарегистрированы на курсы. Студентка Dia, которая нигде не записана, осталась за бортом.

Пример 2: Получение заказов и клиентов

Теперь давайте рассмотрим другой пример. Пусть у нас есть таблицы orders (заказы) и customers (клиенты). Мы хотим получить список всех заказов с именами клиентов.

Таблица orders

order_id customer_id amount
1 101 500
2 102 300
3 103 700

Таблица customers

customer_id name
101 Otto
102 Anna
104 Peter

Задача: нам нужно объединить orders и customers по customer_id, чтобы вернуть только те заказы, у которых есть соответствующий клиент.

SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;

Результат:

order_id name amount
1 Otto 500
2 Anna 300

Обратите внимание, что заказ с order_id = 3 не попал в результат, так как клиент с customer_id = 103 не существует в таблице customers.

КакINNER JOIN помогает соединять таблицы (и что может пойти не так)

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

  • При создании отчетов, где нужно комбинировать данные из нескольких таблиц.
  • Для построения аналитики, когда нужно соединить факты с измерениями (например, продажи и клиенты).
  • Для интеграции данных сторонних систем.

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

Пример ошибки:

В этом примере нет условия объединения, поэтому запрос создаст каждую возможную комбинацию строк из двух таблиц (и это, скорее всего, не то, что вам нужно):

SELECT students.name, enrollments.course_id
FROM students, enrollments;  -- ОШИБКА: нет условия объединения!

Результат будет выглядеть как хаос: каждая строка students совмещается с каждой строкой enrollments.

2
Задача
SQL SELF, 11 уровень, 1 лекция
Недоступна
Простое объединение студентов и курсов
Простое объединение студентов и курсов
2
Задача
SQL SELF, 11 уровень, 1 лекция
Недоступна
Список покупателей и их заказов
Список покупателей и их заказов
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 52
28 января 2026
😎
Anemon Уровень 13 Expert
1 сентября 2025
🤓