Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 12. Использование оператора EXISTS

Можно рассмотреть оценку данного запроса следующим образом. Взять каждую строку таблицы Salesperson в качестве строки-кандидата (внешний запрос) и выпол­ нить подзапросы. Для каждой строки-кандидата из внешнего запроса взять каждую строку из таблицы Customers (средний запрос). Если текущая строка покупателя (customer) не соответствует текущей строке продавца (т.е. если first.snum <> second.snum), то предикат среднего запроса ложен. Как только в среднем запросе най­ дется покупатель, который соответствует продавцу во внешнем запросе, нужно перей­ ти к самому внутреннему запросу, чтобы определить, истинен ли предикат среднего запроса. Самый внутренний запрос выполняет подсчет заказав (orders) для текущего покупателя (из среднего запроса). Если это число превышает 1, то предикат среднего запроса принимает значение "истина", и строка выбирается. Это делает предикат

EXISTS внешнего запроса истинным для текущей строки продавца, что означает, что,

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

Основное назначение подобных примеров - показать те дополнительные средства, которые вам могут понадобиться После работы в таких сложных ситуациях простые запросы, используемые наиболее часто в SQL, покажутся элементарными.

Кроме того, этот запрос связывает три различные таблицы и выдает информацию, которую было бы трудно получить более простым способом. Возможно, на практике такая информацию вам будет нужна регулярно, например, если продавец, обеспечив­

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

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

Итоги

Несмотря на свою кажущуюся простоту, EXISTS относится к наиболее сложным, но весьма гибким и мощным операторам SQL. В этой главе вы познакомились с мно­

гочисленными возможностями этого оператора и существенно расширили свои зна­

ния в области логики сложных подзапросов.

Следующий шаг - рассмотрение трех других специальных операторов, исполь­

зующих подзапросы в качестве аргументов: ANY, ALL, SOME. Из главы 13 вы узнае­ те, что они могут служить альтернативой уже известным операторам, а во многих случаях даже более полезны.

124

Работаем на SQL

1.Запишите запрос с EXISTS для того, чтобы извлечь всех продавцов, имеющих покупателей с рейтингом, превышающим 300.

2.Как решить эту же проблему, применяя соединение?

3.Запишите запрос с EXISTS, выбирающий всех проживающих в одном городе продавцов, а также покупателей, которых эти продавцы не обслуживают.

4.Запишите запрос, извлекающий из таблицы Customers покупателя, назначенного каждому продавцу, который уже имеет по крайней мере одного покупателя (по­ купатель, который выбирается, не учитывается) с заявками в таблице Orders

(Подсказка: по структуре запрос сходен с трехуровневым подзапросом, рассмот­

ренным в примере).

(Ответы см. в приложении А)

125

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

ALLuSOME

Глава 13. Использование операторов ANY, ALL и SOME

В данной главе вы познакомитесь еще с тремя специальными операторами, ори­

ентированными на подзапросы. (Реально их два, поскольку ANY и SOME совпадают по назначению и использованию.) Этими операторами исчерпываются возможные

типы предикатов SQL, используемых в подзапросах. Мы рассмотрим множество спо­

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

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

ANY, ALL и SOME так же, как и EXISTS, используют в качестве аргументов подза­ просы; однако, от EXISTS они отличаются тем, что применяются в конъюнкции с опе­ раторами отношения. В этом плане они сходны с оператором IN, т.е. берут все значения, полученные в подзапросе и рассматривают их как единое целое. Однако, в

отличие от IN, их можно применять только с подзапросами.

Специмьный оператор ANY или SOME

Начнем с операторов ANY или SOME. Независимо от применения, они выполня­ ются абсолютно одинаково и являются взаимозаменяемыми. Различие в терминологии отражает попытку ориентации на интуитивные представления пользователя. Однако, такой подход проблематичен, поскольку интуитивная интерпретация этих операторов может привести к ошибке.

Представляем новый способ найти продавцов с покупателями, находящимися в од­

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

Рис. 13.1. Использование оператора ANY

128

Специш~ьный Ollepamop ANY или SОЛ1Е

SELECT *

FROM Salespeople

WHERE city = ANY

(SELECT city

FROM Customers);

Оператор ANY берет все значения поля sity в таблице Customers, полученные в

подзапросе, и оценивает результат как истину, если какое-либо (ANY) значение совпа­

дает со значением поля city из текущей строки внешнего запроса. Это означает, что подзапрос должен выбирать значения того же типа, которые сравнились в основном

предикате. В этом отношении ANY отличается от EXISTS, который просто определяет

реально не используемые результаты.

Использование IN или EXISTS вместо ANY

Чтобы сформулировать предыдущий запрос, можно воспользоваться операто­

ром IN:

SELECT *

FROM Salespeople

WHERE city IN

(SELECT city

FROM Customers);

Запрос генерирует выходные данные, представленные на рис. 13.2.

--_

 

----~~~so1

,f SI 1 1 (

l

•

'f HOГ'IJ

::-..1 l с-__,рсор 1 ('

'Wlll !<!

< 11 у IN

, ( Sl 1 l С l

с! t у

1 f ~ОМ l11~>tumr1 ·,)

.""". ."..

11111111 Peel

11111112 Serres

11111114 Motika

1

fxecLJt1on Log-- - -~

1

1

,

'

,

 

london

1'""'. 12

 

San

Jose

111.13

 

London

111. 11

•

•

•

 

11

1 :

t __ --~ ~~~~ -~ __ _-~~-~-- __ _

1

1

i

 

 

Рис. 13.2. Использование IN как альтернативы ANY

 

129

Источник: https://studfile.net/preview/16418473/