Мартин грубер понимание sql перевод Лебедева В. Н. Под редакцией Булычева В. Н. Москва, 1993 martin gruber


SELECT * FROM Customers WHERE rating > ANY ( SELECT rating FROM Customers WHERE city = 'Rome' )


Download 1.45 Mb.
bet67/172
Sana26.01.2023
Hajmi1.45 Mb.
#1128343
1   ...   63   64   65   66   67   68   69   70   ...   172
Bog'liq
Грубер. Понимание SQL

SELECT *
FROM Customers
WHERE rating > ANY ( SELECT rating
FROM Customers
WHERE city = 'Rome' );

и еще один пример:
SELECT *
FROM Customers outer
WHERE EXISTS ( SELECT *
FROM Customers inner
WHERE outer.rating > inner.rating
AND inner.city = 'Rome' );

В общем, эти два запроса будут вести себя одинаково. Но предположим, что появилось пустое (NULL) значение в столбце rating таблицы Заказчиков:



CNUM

CNAME

CITY

RATING

SNUM

2003

Liu

SanJose

NULL

1002

В варианте с ANY, где оценка Liu выбрана основным запросом, значение NULL делает предикат неизвестным, а строка Liu не выбирается для вывода. Однако, в варианте с NOT EXISTS, когда эта строка выбрана основным запросом, значение NULL используется в предикате подзапроса, делая его неизвестным в каждом случае. Это означает, что подзапрос не будет производить никаких значений, и EXISTS будет неправилен. Это, естественно, делает оператор NOT EXISTS верным. Следовательно, строка Liu будет выбрана для вывода. Это основное расхождение, в отличие от других типов предикатов, где значение EXISTS независимо от того верно оно или нет — всегда неизвестно. Все это является аргументом в пользу использования варианта формулировки с ANY. Мы не считаем что значение NULL является выше чем допустимое значение. Более того, результат будет тот же, если мы будем проверять для более низкого значения.


ИСПОЛЬЗОВАНИЕ COUNT ВМЕСТО EXISTS
Подчеркнем, что все формулировки с ANY и ALL могут быть в точности выполнены с EXISTS, в то время как наоборот будет неверно. Хотя в этом случае, также верно и то что EXISTS и NOT EXISTS подзапросы могут обманывать при выполнении тех же самых подзапросов с COUNT (*) в предложения SELECT подзапроса. Если больше чем ноль строк выводе будет подсчитано, это эквивалентно EXISTS; в противном случае это работает также как NOT EXISTS. Следующее является этому примером (вывод показывается в Рисунке 13.12):

Download 1.45 Mb.

Do'stlaringiz bilan baham:
1   ...   63   64   65   66   67   68   69   70   ...   172




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling