Задачка на прокачку SQL: разбор ответа
Правильный ответ: 1 строка (в результат попадет только Анна).
Разбор по строкам:
Илья (commission = 100): Условие 100 != 100 ложно (FALSE). Строка отсеивается.
Анна (commission = 0): Условие 0 != 100 истинно (TRUE). Строка попадает в выборку.
Максим (commission = NULL): Строка отсеивается.
Почему? В чем подвох? Вся хитрость заключается в том, как SQL работает с NULL.
Это фундаментальное правило реляционных баз данных и стандарта ANSI SQL.
В SQL используется трехзначная логика (Three-Valued Logic или 3VL).
Это значит, что логическое выражение может принимать не два, а три значения:TRUE (Истина), FALSE (Ложь), UNKNOWN (Неизвестно).
NULL — это не ноль и не пустая строка. Это неизвестность (отсутствие данных).
Когда СУБД пытается сравнить NULL != 100, она «рассуждает» так: «Я не знаю, чему равна комиссия Максима. Равна ли неизвестность числу 100? Я не могу сказать ни да, ни нет». Поэтому любое сравнение с NULL (будь то =, !=, < или >) всегда возвращает UNKNOWN.
Так как оператор WHERE фильтрует данные и пропускает дальше только те строки, которые получили строго TRUE, Максим в итоговую выборку не попадает.
Как это исправить?Если бы вам нужно было найти всех, у кого комиссия не равна 100, и например, включая тех, у кого она не заполнена, запрос пришлось бы переписать с явной проверкой:
SELECT * FROM employees WHERE commission != 100 OR commission IS NULL;
Post #113
3.73K
- 🔥 34
- 👍 22
- ❤ 4