Собесов

Сотрудники с зарплатой > 5000 и наличием менеджера

SQLWHERE с условиямиЛёгкаяJunior

Условие

Дана таблица employees(employee_id, name, salary, manager_id). Напишите запрос, который выводит число сотрудников, у которых зарплата больше 5000 и есть менеджер (manager_id не NULL).

Решение

SELECT COUNT(*)
FROM   employees
WHERE  salary > 5000
  AND  manager_id IS NOT NULL;

Почему IS NOT NULL, а не <> NULL

В SQL manager_id <> NULL всегда возвращает UNKNOWN (трёхзначная логика). Условие в WHERE пропускает только TRUE — поэтому такая строка не пройдёт фильтр.

-- ВРОДЕ работает, но фактически вернёт 0
WHERE manager_id <> NULL;

Только IS NULL / IS NOT NULL корректно проверяют NULL.

Вариация: с группировкой

-- сколько сотрудников с зарплатой > 5000 в каждом отделе с менеджерами
SELECT department, COUNT(*) AS cnt
FROM   employees
WHERE  salary > 5000 AND manager_id IS NOT NULL
GROUP BY department;

Что вернёт COUNT(manager_id) без WHERE

SELECT COUNT(manager_id) FROM employees;
-- посчитает только тех, у кого manager_id не NULL

То есть COUNT(manager_id) уже сам по себе фильтрует NULL'ы, без явного WHERE manager_id IS NOT NULL.

-- эквивалент без WHERE по NULL
SELECT COUNT(manager_id) FROM employees WHERE salary > 5000;

Подводные камни

  1. <> NULL — всегда UNKNOWN, фильтр отсекает строку.
  2. != NULL — то же самое.
  3. Топ-менеджер (manager_id IS NULL) — будет исключён из выборки, что и требуется.
  4. COUNT(*) vs COUNT(manager_id) — первый считает все строки, второй только не-NULL. Если в WHERE уже отфильтровали NULL — оба дадут одно и то же число.

Эталонный ответ

SELECT COUNT(*)
FROM employees
WHERE salary > 5000
  AND manager_id IS NOT NULL;

Главное — использовать IS NOT NULL, а не <> NULL, иначе фильтр молча отсечёт ВСЕ строки.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти