Особенности применения операторов ANY, ALL, EXISTS при обработке пустых значений (NULL)
Необходимо иметь в виду, что при обработке NULL-значе-ний следует учитывать различие реакции на них операторов EXISTS, ANY И ALL.
Когда правильный подзапрос не генерирует никаких выходных данных, оператор ALL автоматически принимает значение истина, а оператор ANY — значение ложь. Запрос SELECT *
FROM UNIVERSITY WHERE RATING > ANY (SELECT RATING FROM UNIVERSITY WHERE CITY = 'New York');
не генерирует выходных данных (подразумевается, что в базе нет данных об университетах города New York), в то время как запрос SKLECT *
FROM UNIVERSITY WHERE RATING > ALL
(SELECT RATING
FROM UNIVERSITY
WHERE CITY = 'New York');
полностью воспроизведет таблицу UNIVERSITY.
Использование NULL-значений создает определенные проблемы для рассматриваемых операторов. Когда в SQL сравниваются два значения, одно из которых NULL-значение, результат принимает значение UNKNOWN (неизвестно). Предикат UNKNOWN, так же, как и FALSE-предикат, создает ситуацию, когда строка не включается в состав выходных данных, но результат при этом будет различен для разных типов запросов, в зависимости от использования в них ALL или ANY вместо EXISTS. Рассмотрим в качестве примера две реализации запроса: найти все данные об университетах, рейтинг которых меньше рейтинга любого университета в Москве.
1) SELECT *
FROM UNIVERSITY WHERE RATING < ANY
(SELECT RATING
1 PROM UNIVERSITY
WHERE CITY = 'Москва');
2) SELECT *
FROM UNIVERSITY A WHERE NOT EXISTS
(SELECT *
FROM UNIVERSITY В WHERE A.RATING >= B.RATING AND B.CITY = 'Москва');
При отсутствии в таблицах NULL оба эти запроса ведут себя совершенно одинаково. Пусть теперь в таблице UNIVERSITY есть строка с NULL-значениями в столбце RATING. В версии запроса с ANY в основном запросе, когда выбирается поле RATING с NULL, предикат принимает значение UNKNOWN и строка не включается в состав выходных данных. Во втором же варианте запроса, когда NOT EXISTS выбирает эту строку в основном запросе, NULL-значение используется в предикате подзапроса, присваивая ему значение UNKNOWN. Поэтому в результате выполнения подзапроса не будет получено ни одного значения, и подзапрос примет значение ложь. Это в свою очередь сделает NOT EXISTS истинным, и, следовательно, строка с NULL-значением в поле RATING попадет в выходные данные. По смыслу запроса такой результат является неправильным, так как на самом деле рейтинг университета, описываемого данной строкой, может быть и больше рейтинга какого-либо московского университета (он просто неизвестен). Указанная проблема связана с тем, что значение EXISTS всегда принимает значения истина или ложь, и никогда — UNKNOWN . Это является доводом для использования в таких случаях оператора ANY вместо EXISTS.
| Maya 3D графика в кино и телевидении Воздействие испытаний ядерного оружия на здоровье населения Объектно-ориентированный язык программирования Java Объектно-ориентированное программирование Delphi Библиотека визуальных компонентов VCL и ее базовые классы Кроссплатформенное программирование для Linux Элементы управления Win32 Элементы управления Windows XP Файлы и устройства ввода/вывода Что такое экспертная система? Объектно-ориентированное программирование Инструментальные средства разработки экспертных систем Программирование на языке CLIPS Критерии и количественные характеристики надежности Расчет характеристик надежности невостанавливаемых резервированных изделий Расчет надежности системы с постоянным резервированием Интегрирование тригонометрических функций ; |