Delphi | Сети | ПК | Маршрутизаторы | Моделирование | Протоколы | Экспертные системы | Удаленный доступ | Доменные имена
Аплеты | SQL | Надежность | Задачи | istanbul rus escort girl For You Информационные процессы | JAVA | Отказы изделия | Расчет надежности показателей | Инфсис

Основные понятия и способы применения SQL - в примерах и задачах

SQL язык запросов к реляционным базам данных Учебник

Особенности применения операторов 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.

Ящик мясной по материалам plastic-system.ru.
Математический анализ, лекции по физике Компьютерные сети