Условие
Дана таблица 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;Подводные камни
<> NULL— всегда UNKNOWN, фильтр отсекает строку.!= NULL— то же самое.- Топ-менеджер (
manager_id IS NULL) — будет исключён из выборки, что и требуется. COUNT(*)vsCOUNT(manager_id)— первый считает все строки, второй только не-NULL. Если в WHERE уже отфильтровали NULL — оба дадут одно и то же число.
Эталонный ответ
SELECT COUNT(*)
FROM employees
WHERE salary > 5000
AND manager_id IS NOT NULL;Главное — использовать IS NOT NULL, а не <> NULL, иначе фильтр молча отсечёт ВСЕ строки.