На прошлой лекции мы обсудили, какие типы 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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ