Использование операторов IN или EXIST вместо оператора 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 Execution Log

SELECT *
FROM Salespeople
WHERE city IN
(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. 2: Использование IN в качестве альтернативы к ANY

SQL Execution Log

SELECT *
FROM Salespeople
WHERE sname < ANY (SELECT cname
FROM Customers);

cnum
cname
city
comm

1001
Peel
London
0.12

1004
Motika
London
0.11

1003
Axelrod
New York
0.10

Рисунок 13. 3: Использование оператора ANY с оператором "неравно" (<)     продавцов для их заказчиков, которые упорядоченны в алфавитном порядке ( вывод показан на Рисунке 13.3)     SELECT * FROM Salespeople WHERE sname < ANY ( SELECT cname FROM Customers );     Все строки были выбраны для Serres и Rifkin, потому что нет других за- казчиков чьи имена следовали бы за ими в алфавитном порядке. Обратите внимание, что это является d основнjм эквивалентом следую- щему запросу с EXISTS, чей вывод показывается в Рисунке 13.4:     SELECT * FROM Salespeople outer WHERE EXISTS ( SELECT * FROM Customers inner WHERE outer.sname < inner.cname );    

SQL Execution Log

SELECT *
FROM Salespeople outer WHERE EXISTS
(SELECT *
FROM Customers inner WHERE outer.sname < inner.cname);

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 могут быть несколько неоднозначен, из-за способа использования этого термина в Английском языке, как вы это скоро увидите. С приходом понимания различия способов формулирования данного запроса, вы сможете поработать над процедурами которые сейчас кажутся Вам трудными или неудобными.  
 
 
 

‹ Специальные операторы ANY или SOME
Вверх
Как ANY может стать неоднозначным ›

Айтистанция
Добавить комментарий