Программирование >>  Формирование связанных подзапросов 

1 2 [ 3 ] 4 5 6 ... 15


2.12. Операторы сравнения с множеством значений IN, ANY, All 59

< ALL, < = ALL

Меньше, чем (либо меньше или равно) все полученные числа. Эквивалентно < или < = самого меньшего полученного числа.

Следует иметь в виду, что в некоторхх СУБД поддерживаются не все из этих операторов.

Примеры запросов с использованием приведеннхх операторов Выбрать сведения о студентах, проживающих в городе, где расположен университет, в котором они учатся.

SELECT *

FROM STUDENT S WHERE CITY = ANY (SELECT CITY

FROM UNIVERSITY U

WHERE U.UNIV ID = S.UNIV ID);

Другой вариант этого запроса:

SECT *

FROM STUDENT S

WHERE CITY IN

(ECT CITY

FROM UNIVERSITY U

WHERE U.UNIV ID = S . UNIV ID);

Выборка данных об идентификаторах студентов, у которхх оценки превосходят величину, по крайней мере, одной из оценок, полученнхх ими же 6 октября 1999 года.

SECT DISTINCT STUDENT ID

FROM EXAM MARKS WHERE MARK > ANY

(SELECT MARK

FROM EXAM MARKS

WHERE EXAM DATE = Oe/lO/lS);



Оператор ALL, как правило, эффективно используется с неравенствами, а не с равенствами, поскольку значение равно всем, которое должно получиться в этом случае в результате выполнения подзапроса, может иметь место, только если все результаты! идентичны. Такая ситуация практически не может быть реализована, так как если подзапрос генерирует множество различных значений, то никакое одно значение не может быть равно сразу всем значениям в обычном смысле. В SQL выражение < > ALL реально означает не равно ни одному из результатов подзапроса.

Подзапрос, выбирающий данные о названиях всех университетов с рейтингом более высоким, чем рейтинг любого университета Воронежа:

SELECT *

FROM UNIVERSITY WHERE RATING > ALL (SECT RATING

FROM UNIVERSITY

WHERE CITY = Воронеж) ;

В этом запросе вместо ALL можно использовать ANY (проанализируйте, как в этом случае изменится смысл приведенного запроса):

SELECT *

FROM UNIVERSITY WHERE NOT RATING > ANY (SELECT RATING

FROM UNIVERSITY

WHERE CITY = Всрсн);

2.13. Особенности применения операторов ANY, ALL, EXISTS при обработке пустых значений (NULL.)

Необходимо иметь в виду, что при обработке NULL-значе-ний следует учитывать различие реакции на них операторов EXISTS, ANYИ ALL.



2.13. Особенности применения операторов ANY, ALL, EXISTS 61

Когда правильнтй подзапрос не генерирует никаких в1ход-н1х данных, оператор ALL автоматически принимает значение истина, а оператор ANY - значение ложь. Запрос SELECT *

FROM UNIVERSITY WHERE RATING > ANY (SELECT RATING

FROM UNIVERSITY

WHERE CITY = New York);

не генерирует в1ходн1х даннхх (подразумевается, что в базе нет даннхх об университетах города 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) SECT *

FROM UNIVERSITY WHERE RATING < ANY

(SECT RATING



1 2 [ 3 ] 4 5 6 ... 15

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика