Какая разница между left join и inner join?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между LEFT JOIN и INNER JOIN в SQL
Основное отличие между LEFT JOIN (или LEFT OUTER JOIN) и INNER JOIN заключается в логике выборки данных и обработке несовпадающих записей. Оба оператора используются для объединения таблиц по определённому условию, но результат их работы существенно различается.
Ключевые отличия
- INNER JOIN возвращает только те строки, где есть совпадение в обоих объединяемых таблицах согласно условию соединения (
ON). Строки без совпадения в любой из таблиц исключаются из результирующего набора. - LEFT JOIN возвращает все строки из левой таблицы (указанной перед
JOIN), даже если для них нет совпадений в правой таблице. В случае отсутствия совпадения, все столбцы из правой таблицы в результирующей строке будут содержать значенияNULL. Строки из правой таблицы, для которых нет совпадения в левой, не попадают в результат.
Визуализация на диаграммах (логически)
INNER JOIN: Только пересечение множеств A и B.
[A] ∩ [B]
LEFT JOIN: Всё множество A + пересечение с B.
[A] + ([A] ∩ [B])
Практический пример
Рассмотрим две простые таблицы.
Таблица Users (левая таблица):
| id | name |
|---|---|
| 1 | Анна |
| 2 | Борис |
| 3 | Виктор |
Таблица Orders (правая таблиция):
| id | user_id | amount |
|---|---|---|
| 101 | 1 | 500 |
| 102 | 1 | 300 |
| 103 | 2 | 700 |
| 104 | NULL | 100 |
1. INNER JOIN по Users.id = Orders.user_id
SELECT Users.name, Orders.amount
FROM Users
INNER JOIN Orders ON Users.id = Orders.user_id;
Результат: Вернутся только записи, где есть совпадение в обеих таблицах. Строки Виктор (нет заказов) и заказ с id=104 (нет пользователя) будут проигнорированы.
| name | amount |
|---|---|
| Анна | 500 |
| Анна | 300 |
| Борис | 700 |
2. LEFT JOIN по Users.id = Orders.user_id
SELECT Users.name, Orders.amount
FROM Users
LEFT JOIN Orders ON Users.id = Orders.user_id;
Результат: Вернутся все пользователи из таблицы Users. Для тех, у кого есть заказы, будут показаны данные о них. Для Виктора, у которого заказов нет, в столбцах из таблицы Orders будет NULL. Заказ с id=104 (правая таблица без соответствия в левой) в результат не попадёт.
| name | amount |
|---|---|
| Анна | 500 |
| Анна | 300 |
| Борис | 700 |
| Виктор | NULL |
Важные следствия для тестирования (QA Perspective)
Понимание этой разницы критически важно для проверки корректности отчетов, дашбордов и любого функционала, связанного с выборкой данных. Вот на что стоит обращать внимание:
- Проверка полноты данных:
LEFT JOINчасто используют, чтобы убедиться, что ни одна запись из основной (левой) таблицы не потеряна. Например, при тестировании отчета "Все клиенты и их покупки" нужно проверить, что клиенты без покупок отображаются с нулевыми или пустыми значениями, а не исчезают из списка. - Проверка подсчётов:
COUNT()при использовании с разными типамиJOINдаёт разные результаты.SELECT COUNT(*) FROM Users INNER JOIN Orders ... -- Посчитает только совпавшие пары. SELECT COUNT(*) FROM Users LEFT JOIN Orders ... -- Посчитает всех пользователей. SELECT COUNT(Orders.id) FROM Users LEFT JOIN Orders ... -- Посчитает только заказы, у `Виктора` будет 0.
Неправильный выбор `JOIN` — частая причина ошибок в метриках (например, заниженное количество пользователей).
- Понимание бизнес-логики: Тестировщик должен понимать, что хочет увидеть пользователь. Нужен ли список "всех сущностей A с возможными привязанными B" (
LEFT JOIN) или только "те A, для которых существуют B" (INNER JOIN)? - Обработка NULL: После
LEFT JOINв запросе появляются потенциальныеNULLзначения. Необходимо проверять, как приложение их обрабатывает: скрывает, заменяет на "0" или "N/A", корректно ли с ними работают агрегатные функции и фильтрыWHERE.
Резюме для собеседования
- INNER JOIN — это пересечение. Операция для получения строго связанных данных. Если связь отсутствует, записи отбрасываются.
- LEFT JOIN — это все из первой таблицы плюс связанные данные из второй. Это гарантирует, что ни одна запись из основного (левого) источника данных не будет потеряна, даже если связей для неё нет. Это фундаментальное различие, определяющее полноту результирующего набора данных.
Для QA-инженера это знание позволяет целенаправленно создавать тестовые данные (включая случаи с отсутствующими связями), точно формулировать ожидаемый результат в тест-кейсах и эффективно исследовать причины расхождений в данных.