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