Найти департаменты без сотрудников

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 особенно хорошо отражает её смысл: выбрать департаменты, для которых не существует ни одного сотрудника.