Вопрос проверяет понимание JOIN-ов и умение корректно работать с отсутствующими связями в реляционных базах данных.
Для выбора записей без связанных сущностей обычно используется LEFT JOIN с проверкой на NULL. Такой запрос позволяет получить строки из основной таблицы, для которых нет соответствующих строк в связанной таблице. Это стандартный и читаемый подход. Альтернативно можно использовать подзапросы с NOT EXISTS. Выбор зависит от читаемости и оптимизации.
Задача выбора записей без связанных сущностей часто встречается при работе с внешними ключами.
Наиболее распространенный подход — LEFT JOIN.
Идея заключается в том, что:
строки из основной таблицы всегда возвращаются
если связанной записи нет, поля из второй таблицы будут NULL
Пример:
SELECT u.*
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;
Этот запрос вернет пользователей без заказов.
Альтернативный и часто более надежный вариант — NOT EXISTS.
Пример:
SELECT u.*
FROM users u
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
);
Преимущества:
не зависит от NULL
хорошо оптимизируется планировщиком
корректно работает при сложных условиях
простой случай → LEFT JOIN + IS NULL
сложные условия → NOT EXISTS
большие данные → проверять execution plan
использование INNER JOIN
проверка NULL не по ключу
дублирование строк из-за неправильного JOIN
Вывод: для поиска записей без связей используются LEFT JOIN с IS NULL или NOT EXISTS, и выбор зависит от конкретного сценария.