Необходимо иметь в виду, что при обработке NULL-значений следует учитывать различие реакции на них операторов EXISTS, ANYи ALL.
Когда правильный подзапрос не генерирует никаких выходных данных, оператор ALLавтоматически принимает значение истина, а оператор ANY– значение ложь.
Запрос
SELECT*
FROMUNIVERSITY
WHERERATING > ANY
(SELECTRATING
FROMUNIVERSITY
WHERECITY = ‘New York’);
не генерирует выходных данных (подразумевается, что в базе нет данных об университетах из город а New York), в то время как запрос
SELECT*
FROMUNIVERSITY
WHERERATING > ALL
(SELECTRATING
FROMUNIVERSITY
WHERECITY = ‘New York’);
полностью воспроизведет таблицу UNIVERSITY.
Использование NULL-значений создает определенные проблемы для рассматриваемых операторов. Когда в SQL сравниваются два значения, одно из которых NULL-значение, результат принимает значение UNKNOWN(неизвестно). Предикат UNKNOWN, также как и FALSE-предикат, создает ситуацию, когда строка не включается в состав выходных данных, но результат при этом будет различен для разных типов запросов, в зависимости от использования в них ALLили ANYв место EXISTS. Рассмотрим в качестве примера две реализации запроса: найти все данные об университетах, рейтинг которых меньше рейтинга любого университета в Москве.
1) SELECT*
FROMUNIVERSITY
WHERERATING < ANY
(SELECTRATING
FROMUNIVERSITY
WHERECITY = ‘Москва ’);
2) SELECT*
FROMUNIVERSITY A