ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ 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);
cnum |
cname |
city |
comm |
1001 |
Peel |
London |
0.12 |
1002 |
Serres |
San Jose |
0.13 |
1004 |
Motika |
London |
0.11 |
Рисунок 13. 2: Использование IN в качестве альтернативы к ANY
cnum |
cname |
city |
comm |
1001 |
Peel |
London |
0.12 |
1004 |
Motika |
London |
0.11 |
1003 |
Axelrod |
New York |
0.10 |
Рисунок 13.4 Использование EXISTS как альтернатива оператору ANY.
Любой запрос который может быть сформулирован с ANY ( или, как мы увидим, с ALL ), мог быть также
сформулирован с EXISTS, хотя наоборот будет неверно. Строго говоря, вариант с EXISTS не абсолютно
идентичен
вариантам с ANY или с ALL из-за различия в том как обрабатываются пустые( NULL ) значения ( что будет
обсуждаться
позже ). Тем ни менее, с технической точки зрения, вы могли бы делать это без ANY и ALL если бы вы
стали
очень находчивы в использовании EXISTS ( и IS NULL ). Большинство пользователей, однако, находят ANY и
ALL более
удобными в использовании чем EXISTS, который требует соотнесенных подзапросов. Кроме того, в зависимости
от
реализации, ANY и ALL могут, по крайней мере в теории, быть более эффективными чем EXISTS. Подзапросы
ANY или ALL
могут выполняться один раз и иметь вывод используемый чтобы опре- делять предикат для каждой строки
основного
запроса. EXISTS, с другой стороны, берет соотнесенный подзапрос, который требует чтобы весь подзапрос
повторно
выполнялся для каждой строки основного запроса. SQL пытается найти наиболее эффективный способ выполнения
любой
команды, и может попробовать преобразовать менее эффективную формулу запроса в более эффективную (но
вы не можете
всегда рассчитывать на получение самой эффективной формулировки ). Основная причина для формулировки
EXISTS как
альтернативы ANY и ALL в том что ANY и ALL могут быть несколько неоднозначен, из-за способа использования
этого
термина в Английском языке, как вы это скоро увидите. С приходом понимания различия способов формулирования
данного запроса, вы сможете поработать над процедурами которые сейчас кажутся Вам трудными или неудобными.