63. Найти департаменты без сотрудников
Условие задачи:
Даны две таблицы:
Department(id, name)— департаменты;Employee(id, salary, department_id)— сотрудники.
Необходимо вывести все департаменты, в которых нет ни одного сотрудника.
Спойлеры к решению
Подсказки
💡 Удобно использовать
💡 Альтернативный вариант —
💡
NOT EXISTS: для каждого департамента проверить отсутствие связанных сотрудников.💡 Альтернативный вариант —
LEFT JOIN с последующей проверкой, что соответствующая строка сотрудника не найдена.💡
INNER JOIN здесь не подходит, поскольку он исключит департаменты без сотрудников.Решение
Основной вариант через NOT EXISTS:
SELECT
d.id,
d.name
FROM Department d
WHERE NOT EXISTS (
SELECT 1
FROM Employee e
WHERE e.department_id = d.id
);
Для каждого департамента подзапрос ищет хотя бы одного связанного сотрудника:
WHERE e.department_id = d.id
NOT EXISTS оставляет только те департаменты, для которых такой сотрудник не найден.
Альтернативный вариант через LEFT JOIN:
SELECT
d.id,
d.name
FROM Department d
LEFT JOIN Employee e
ON e.department_id = d.id
WHERE e.department_id IS NULL;
LEFT JOIN сохраняет все департаменты. Если сотрудников в департаменте нет, соответствующей строки из Employee не будет, поэтому поля этой таблицы окажутся NULL.
Оба варианта решают задачу, но NOT EXISTS особенно хорошо отражает её смысл: выбрать департаменты, для которых не существует ни одного сотрудника.