Delphi | Сети | ПК | Маршрутизаторы | Моделирование | Протоколы | Экспертные системы |
Художественные возможности материалов
Удаленный доступ | Доменные имена развития компьютерной графики
Аплеты | SQL | Надежность | Задачи | Информационные процессы | Очередь 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.

Maya 3D графика в кино и телевидении Воздействие испытаний ядерного оружия на здоровье населения Объектно-ориентированный язык программирования Java Объектно-ориентированное программирование Delphi Библиотека визуальных компонентов VCL и ее базовые классы Кроссплатформенное программирование для Linux Элементы управления Win32 Элементы управления Windows XP Файлы и устройства ввода/вывода Что такое экспертная система? Объектно-ориентированное программирование Инструментальные средства разработки экспертных систем Программирование на языке CLIPS Критерии и количественные характеристики надежности Расчет характеристик надежности невостанавливаемых резервированных изделий Расчет надежности системы с постоянным резервированием Интегрирование тригонометрических функций ;