← Назад к вопросам

Что такое INNER JOIN?

1.3 Junior🔥 143 комментариев
#Базы данных и SQL

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое INNER JOIN?

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

Основной принцип работы

INNER JOIN работает по следующему алгоритму:

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

Синтаксис INNER JOIN

SELECT столбцы
FROM таблица1
INNER JOIN таблица2
    ON таблица1.ключевой_столбец = таблица2.ключевой_столбец;

Ключевое слово INNER часто опускается, так как JOIN по умолчанию означает INNER JOIN:

-- Эквивалентная запись
SELECT столбцы
FROM таблица1
JOIN таблица2
    ON таблица1.ключевой_столбец = таблица2.ключевой_столбец;

Практический пример

Рассмотрим две таблицы в контексте C# Backend приложения, работающего с базой данных:

Таблица Users (Пользователи):

CREATE TABLE Users (
    Id INT PRIMARY KEY,
    Name NVARCHAR(50),
    Email NVARCHAR(100)
);

Таблица Orders (Заказы):

CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    UserId INT FOREIGN KEY REFERENCES Users(Id),
    Amount DECIMAL(10,2),
    OrderDate DATE
);

Чтобы получить список всех заказов с именами пользователей:

SELECT 
    Users.Name,
    Users.Email,
    Orders.OrderId,
    Orders.Amount,
    Orders.OrderDate
FROM Users
INNER JOIN Orders
    ON Users.Id = Orders.UserId;

Особенности и важные аспекты

  1. Условие связи (ON) — определяет, по каким полям происходит соединение таблиц. Обычно это первичный и внешний ключи, но могут использоваться любые логически связанные столбцы.

  2. Фильтрация NULL значений — поскольку INNER JOIN возвращает только совпадающие строки, записи с NULL в ключевых полях исключаются из результата.

  3. Производительность — при больших объемах данных важно наличие индексов на полях, участвующих в условии JOIN, иначе производительность может значительно снизиться.

  4. Множественные соединения — можно последовательно соединять несколько таблиц:

SELECT *
FROM Table1
JOIN Table2 ON Table1.Id = Table2.Table1Id
JOIN Table3 ON Table2.Id = Table3.Table2Id;
  1. Альтернативный синтаксис — старый синтаксис с WHERE (не рекомендуется, но встречается в legacy-коде):
SELECT *
FROM Table1, Table2
WHERE Table1.Id = Table2.Table1Id;

Пример в контексте C# Backend

При разработке на C# с использованием ORM, такой как Entity Framework Core, INNER JOIN часто скрыт за навигационными свойствами:

// Использование LINQ для INNER JOIN в Entity Framework Core
var userOrders = context.Users
    .Join(context.Orders,
        user => user.Id,
        order => order.UserId,
        (user, order) => new 
        {
            UserName = user.Name,
            OrderId = order.OrderId,
            Amount = order.Amount
        })
    .ToList();

// Или через навигационные свойства (более предпочтительный способ)
var userOrders2 = context.Users
    .SelectMany(user => user.Orders
        .Select(order => new 
        {
            UserName = user.Name,
            OrderId = order.OrderId,
            Amount = order.Amount
        }))
    .ToList();

Отличия от других типов JOIN

  • LEFT (OUTER) JOIN — возвращает все строки из левой таблицы и совпадающие из правой (с NULL для отсутствующих совпадений)
  • RIGHT (OUTER) JOIN — возвращает все строки из правой таблицы и совпадающие из левой
  • FULL (OUTER) JOIN — возвращает все строки из обеих таблиц
  • CROSS JOIN — возвращает декартово произведение таблиц

Заключение

INNER JOIN является фундаментальной операцией при работе с реляционными базами данных в C# Backend разработке. Его правильное использование позволяет:

  • Извлекать связанные данные из нормализованных таблиц
  • Снижать избыточность хранения информации
  • Улучшать целостность данных
  • Оптимизировать запросы к базе данных

Понимание INNER JOIN и его отличий от других типов соединений критически важно для написания эффективных SQL-запросов и построения корректной логики доступа к данным в Backend-приложениях.

Что такое INNER JOIN? | PrepBro