Скачиваний:
25
Добавлен:
01.04.2014
Размер:
761.34 Кб
Скачать

146 Понимание sql

______________________________________________________________________

ГЛ. 12

================ РЕЗЮМЕ ================

EXISTS, хотя он и кажется простым, может быть одним из самых непонят-

ных операторов SQL. Однако, он облажает гибкостью и мощностью. В этой

главе, вы видели и овладели большинством возможностей которые EXISTS

дает вам. В дальнейшем, ваше понимание улучшеной логики подзапроса

расширится значительно.

Следующим шагом будет овладение тремя другими специальными операто-

рами которые берут подзапросы как аргументы, это - ANY, ALL, и SOME.

Как вы увидете в Главе 13, это - альтернативные формулировки некоторых

вещей которые вы уже использовали, но которые в некоторых случаях, могут

оказаться более предпочтительными.

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРА EXISTS 147

______________________________________________________________________

************** Работа с sql **************

1. Напишите запрос который бы использовал оператор EXISTS для извле-

чения всех продавцов которые имеют заказчиков с оценкой 300.

2. Как бы вы решили предыдущую проблему используя обьединение ?

3. Напишите запрос использующий оператор EXISTS который выберет

всех продавцов с заказчиками размещенными в их городах которые ими

не обслуживаются.

4. Напишите запрос который извлекал бы из таблицы Заказчиков каждого

заказчика назначенного к продавцу который в данный момент имеет

по крайней мере еще одного заказчика ( кроме заказчика которого вы

выберете ) с порядками в таблице Порядков ( подсказка: это может

быть похоже на структуру в примере с нашим трех-уровневым подзап-

росом ).

( См. Приложение A для ответов. )

12

Использование оператора exists

150 ПОНИМАНИЕ SQL

______________________________________________________________________

ГЛ. 13

ТЕПЕРЬ, КОГДА ВЫ ОВЛАДЕЛИ ОПЕРАТОРОМ EXISTS,

Вы узнаете приблизительно три специальных оператора ориентируемых

на подзапросы.

(Фактически, имеются только два, так как ANY и SOME - одно и то же.)

Если вы поймете работу этих операторов, вы будете понимать все типы

подзапросов предиката используемых в SQL . Кроме того, вы будете

представлены различным способам где данный запрос может быть

сформирован используя различные типы подзапросов предиката, и вы

поймете преимущества и недостатки каждого из этих подходов.

ANY, ALL, и SOME напоминают EXISTS который воспринимает подзапросы

как аргументы; однако они отличаются от EXISTS тем, что используются сов-

местно с реляционными операторами. В этом отношении, они напоминают

оператор IN когда тот используется с подзапросами; они берут все значения

выведенные подзапросом и обрабатывают их как модуль. Однако, в отличие

от IN, они могут использоваться только с подзапросами.

========= СПЕЦИАЛЬНЫЕ ОПЕРАТОРЫ ============

ANY или SOME

Операторы SOME и ANY - взаимозаменяемы везде и там где мы используем

ANY, SOME будет работать точно так же. Различие в терминологии состоит

в том чтобы позволить людям использовать тот термин который наиболее

однозначен. Это может создать проблему; потому что, как мы это увидим,

наша интуиция может иногда вводить в заблуждение.

Имеется новый способ нахождения продавца с заказчиками размещенными

в их городах ( вывод для этого запроса показывается в Рисунке 13.1 ):

SELECT *

FROM Salespeople

WHERE city = ANY

(SELECT city

FROM Customers );

Оператор ANY берет все значения выведенные подзапросом, ( для этого

случая - это все значения city в таблице Заказчиков ), и оценивает их как

верные если любой(ANY) из их равняется значению города текущей строки

внешнего запроса.

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ ANY, ALL, И SOME 151

______________________________________________________________________

=============== SQL Execution Log ============

| SELECT * |

| FROM Salespeople |

| WHERE city = ANY |

| (SELECT city |

| FROM Customers); |

| ============================================= |

| cnum cname city comm |

| ----- -------- ---- -------- |

| 1001 Peel London 0.12 |

| 1002 Serres San Jose 0.13 |

| 1004 Motika London 0.11 |

=============================================

Рисунок 13. 1: Использование оператора ANY

Это означает, что подзапрос должен выбирать значения такого же типа как

и те, которые сравниваются в основном предикате.

В этом его отличие от EXISTS, который просто определяет, производит ли под-

запрос результаты или нет, и фактически не использует эти результаты.

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ IN ИЛИ EXISTS

ВМЕСТО ОПЕРАТОРА ANY

Мы можем также использовать оператор IN чтобы создать запрос аналогич-

ный предыдущему :

SELECT *

FROM Salespeople

WHERE city IN

( SELECT city

FROM Customers );

Этот запрос будет производить вывод показанный в Рисунке 13.2.

Однако, оператор ANY может использовать другие реляционные опера-

торы кроме равняется ( = ), и таким образом делать сравнения которые

являются выше возможностей IN. Например, мы могли бы найти всех

продавцов с их заказчиками которые следуют им в алфавитном поряд-

ке ( вывод показан на Рисунке 13.3)

SELECT *

FROM Salespeople

WHERE sname < ANY

( SELECT cname

FROM Customers);

Соседние файлы в папке ПОНИМАНИЕ SQL