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

Как работает JOIN?

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

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

JOIN в SQL: Полное объяснение

JOIN — это один из самых важных операторов SQL, который позволяет комбинировать строки из двух или более таблиц на основе связанного столбца между ними. QA-инженеру крайне важно понимать различные типы JOIN для проверки корректности выборки данных и написания правильных SQL запросов при тестировании.

Основная концепция

JOIN используется для объединения данных из разных таблиц. Без JOIN нам пришлось бы делать несколько отдельных запросов и комбинировать результаты в приложении — это неэффективно.

Пример: У нас есть таблица users и таблица orders. Мы хотим получить информацию о пользователях вместе с их заказами.

Типы JOIN

1. INNER JOIN (внутреннее объединение)

Суть: возвращает только те строки, которые имеют совпадения в ОБЕИХ таблицах.

SQL синтаксис:

SELECT u.name, o.order_id, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

Визуально:

Таблица users:        Таблица orders:
id | name             id | user_id | amount
1  | Alice            1  | 1       | 100
2  | Bob              2  | 1       | 200
3  | Carol            3  | 2       | 150

Результат INNER JOIN:
name  | order_id | amount
Alice | 1        | 100
Alice | 2        | 200
Bob   | 3        | 150

Важно: Carol не появится в результате, потому что у неё нет заказов.

Когда использовать: когда нужны только записи, которые существуют в обеих таблицах.

2. LEFT JOIN (левое объединение)

Суть: возвращает ВСЕ строки из левой таблицы, плюс совпадающие строки из правой таблицы. Если совпадений нет — NULL.

SQL синтаксис:

SELECT u.name, o.order_id, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

Результат:

name  | order_id | amount
Alice | 1        | 100
Alice | 2        | 200
Bob   | 3        | 150
Carol | NULL     | NULL

Важно: Carol появится в результате с NULL значениями, так как она в левой таблице.

Когда использовать: когда нужны все данные из левой таблицы, включая записи без соответствия.

3. RIGHT JOIN (правое объединение)

Суть: противоположность LEFT JOIN. Возвращает все строки из ПРАВОЙ таблицы, плюс совпадающие из левой.

SQL синтаксис:

SELECT u.name, o.order_id, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

Практическое применение: реже используется, чем LEFT JOIN.

4. FULL OUTER JOIN (полное объединение)

Суть: возвращает ВСЕ строки из ОБЕИХ таблиц. Если совпадений нет — NULL с обеих сторон.

SQL синтаксис:

SELECT u.name, o.order_id, o.amount
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;

Результат:

name  | order_id | amount
Alice | 1        | 100
Alice | 2        | 200
Bob   | 3        | 150
Carol | NULL     | NULL

Примечание: FULL OUTER JOIN не поддерживается в MySQL. Используется в PostgreSQL, SQL Server.

5. CROSS JOIN (декартово произведение)

Суть: комбинирует каждую строку левой таблицы с каждой строкой правой таблицы. Результат: m × n строк.

SQL синтаксис:

SELECT u.name, o.order_id
FROM users u
CROSS JOIN orders o;

Если в users 3 записи, в orders 3 записи → результат 9 записей.

Когда использовать: редко, для сложных аналитических запросов.

Условие ON vs WHERE

ON — условие для JOIN, применяется ПЕРЕД объединением:

SELECT *
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

WHERE — фильтрует результат ПОСЛЕе объединения:

SELECT *
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.amount > 100;

Важное отличие: при LEFT JOIN фильтр в WHERE может привести к тому же результату, что и INNER JOIN.

JOIN с множественными таблицами

Можно объединять более двух таблиц:

SELECT u.name, o.order_id, p.product_name
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN products p ON o.product_id = p.id;

Практические примеры для тестирования

Тест-кейс 1: проверить, что в отчёте по заказам отображаются ВСЕ пользователи, включая тех, у кого нет заказов (LEFT JOIN).

Тест-кейс 2: проверить, что в аналитике заказов не отображаются заказы без пользователей (INNER JOIN для целостности данных).

Тест-кейс 3: выявить orphan-записи в таблице заказов (FULL OUTER JOIN + WHERE ... IS NULL).

Производительность

INNER JOIN — обычно самый быстрый, так как фильтрует данные на этапе объединения.

LEFT JOIN — медленнее, так как должен сохранить все строки левой таблицы.

FULL OUTER JOIN — самый медленный, так как должен обработать все комбинации.

Для оптимизации важно:

  • Добавлять индексы на колонки, используемые в ON условии
  • Избегать JOIN на вычисляемые поля
  • Использовать EXPLAIN для анализа плана выполнения

Заключение

Понимание JOIN критично для QA-инженера, так как это основа для:

  • Проверки целостности данных в системе
  • Написания SQL запросов для анализа тестовых данных
  • Отладки проблем с отображением связанных данных
  • Понимания, как приложение извлекает и комбинирует данные из БД