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

В чем разница между join и inner join?

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

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

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

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

Краткий ответ

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

Подробное объяснение и контекст

Чтобы понять, почему эти термины взаимозаменяемы, нужно разобраться в видах SQL JOIN.

Основные типы соединений (JOIN) в SQL

SQL стандарт определяет несколько основных видов соединений таблиц:

  • INNER JOIN (или просто JOIN): Возвращает только те строки, где есть совпадение в обоих соединяемых таблицах.
  • LEFT (OUTER) JOIN: Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет, для правой таблицы возвращаются NULL.
  • RIGHT (OUTER) JOIN: Возвращает все строки из правой таблицы и совпадающие строки из левой. Аналог LEFT JOIN, но "наоборот".
  • FULL (OUTER) JOIN: Возвращает все строки, когда есть совпадение либо в левой, либо в правой таблице. По сути, объединение LEFT и RIGHT JOIN.
  • CROSS JOIN: Возвращает декартово произведение строк обеих таблиц (каждую строку из таблицы A с каждой строкой из таблицы B).

Ключевое слово OUTER в LEFT/RIGHT/FULL JOIN, как и INNER, также часто опускается. LEFT JOIN и LEFT OUTER JOIN — это одно и то же.

Почему JOIN по умолчанию означает INNER JOIN?

Исторически сложилось, что внутреннее соединение является наиболее часто используемой операцией. Оно интуитивно понятно: "покажи данные, которые связаны между собой". Поэтому для удобства и краткости синта ксиса было решено, что JOIN без дополнительных модификаторов будет трактоваться именно как INNER JOIN. Это правило соблюдается во всех основных СУБД: PostgreSQL, MySQL, Microsoft SQL Server, Oracle.

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

Рассмотрим две простые таблицы.

Таблица Employees:

idnamedepartment_id
1Анна10
2Борис20
3ВикторNULL

Таблица Departments:

idname
10Разработка
20Тестирование
30Маркетинг

Теперь напишем два идентичных по результату запроса:

Запрос 1: Использование INNER JOIN

SELECT Employees.name, Departments.name as department
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;

Запрос 2: Использование JOIN

SELECT Employees.name, Departments.name as department
FROM Employees
JOIN Departments ON Employees.department_id = Departments.id;

Результат выполнения ОБОИХ запросов будет одинаковым:

namedepartment
АннаРазработка
БорисТестирование

Обратите внимание:

  • Виктор не попал в результат, потому что у него department_id = NULL и нет совпадения в таблице Departments (внутреннее соединение исключает строки без совпадения).
  • Департамент "Маркетинг" не попал в результат, потому что на него нет ссылок из таблицы Employees.

Для сравнения, LEFT JOIN вернул бы другую выборку:

SELECT Employees.name, Departments.name as department
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;

Результат LEFT JOIN:

namedepartment
АннаРазработка
БорисТестирование
ВикторNULL

Рекомендации для QA-инженера

  1. Понимание для тестирования: При проверке работы отчетов или любого функционала, связанного с выборкой связанных данных, вы должны четко понимать, какой тип JOIN используется в запросах. Ошибка в выборе типа соединения — классический источник дефектов (потеря данных или, наоборот, их избыточность).
  2. Читаемость кода (в автотестах): В своих автоматизированных тестах, особенно при использовании ORM (например, SQLAlchemy для Python) или написании сырых SQL-запросов для подготовки/проверки данных, я рекомендую явно указывать INNER JOIN. Это делает код самодокументируемым и более понятным для других членов команды, особенно для тех, кто только начинает работать с SQL.
  3. Анализ логов и планов запросов: В логах приложения или в плане выполнения запроса (EXPLAIN) вы, скорее всего, увидите именно Inner или Nested Loop, что соответствует внутреннему соединению.

Итог: С точки зрения функциональности SQL-движка разницы между JOIN и INNER JOIN нет. Разница — исключительно в стиле написания кода и его явности для разработчиков. Понимание этой детали является базовым знанием для работы с реляционными базами данных.

В чем разница между join и inner join? | PrepBro