Программирование >>  Понятие sql 

1 ... 30 31 32 [ 33 ] 34 35 36 ... 95


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

1001 1004 1003

cname

Peel Motika Axelrod

city

comm

London London New York

0.12 0.11 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 МОЖЕТ СТАТЬ НЕОДНОЗНАЧН1М

Как подразумевалось выше,ANY не полностью однозначен. Если мы создаем запрос, чтобы выбрать заказчиков, которые имеют больший рейтинг чем любой заказчик в Риме, мы можем получить, вывод который несколько отличался бы от того, что мы ожидали (как показано в Рисунке 13.5):



SELECT *

FROM Customers

WHERE rating > ANY ( SELECT rating

FROM Customers WHERE city = Rome );

В Английском языке, способ которым мы обычно склонны интерпретировать оценку больше чем любой (где city = Rome) , должен вам сообщить, что это значение оценки должно быть выше, чем значение оценки в каждом случае где значение city = Rome. Однако этонетак, вслучае ANY - используемом в SQL. ANY оценивает как верно, если подзапрос находит любое значение которое делает условие верным.

SQL Execution Log

SELECT *

FROM Customers

WHERE rating > ANY

(SELECT rating

FROM Customers

WHERE city = Rome);

cnum

cname

city

rating

snum

2002

Giovanni

Rome

1003

2003

San Jose

1002

2004

Grass

Berlin

1002

2008

Cisneros

San Jose

1007

Рисунок 13.5: Как оператор больше чем (>) интерпретируется ANY

Если мы оценим ANY способом, использующим грамматику Английского Языка, то только заказчики с оценкой 300 будут превышать Giovanni, который находится в Риме и имеет оценку 200. Однако, подзапрос ANY также находит Periera вРиме с оценкой 100. Так как все заказчики с оценкой 200 были выше этой, они будут выбраны, даже если имелся другой заказчик из Рима (Giovanni), чья оценка не была выше (фактически, то что один из выбранных заказчиков также находится в Риме несущественно). Так как подзапрос произвел по крайней мере одно значение, которое сделает предикат верным в отношении этих строк, строки были выбраны.

Чтобы дать другой пример, предположим что мы должны были выбирать все порядки сумм приоретений которые были больше чем по крайней мере один из порядков на 6-еОктября:

SELECT * FROM Orders

WHERE amt > ANY ( SELECT amt FROM Orders WHERE odate

= 10/06/1990 );

Вывод для этого запроса показывается в Рисунке 13.6.



SQL Execution Log

SELECT * FROM Orders WHERE amt > ANY (SELECT amt FROM Orders WHERE odate = 10/06/1990);

onum

odate

cnum

snum

3002

1900.10

10/03/1990

2007

1004

3005

5160.45

10/03/1990

2003

1002

3009

1713.23

10/04/1990

2002

1003

3008

4723.00

10/05/1990

2006

1001

3011

9891.88

10/06/1990

2006

1001

Рисунок 13.6: Выбранное значение больше чем любое (ANY) на 6-е Октября

Даже если самая высокая сумма приобретений в таблице (9891.88) - имелась на 6-еОктября, предыдущая строка имеет более высокое значение суммы чем другая строка на 6-еОктября, которая имела значение суммы = 1309.95. Имея реляционный оператор >= вместо просто > , эта строка будет также выбирана, потому что она равна самой себе.

Конечно, вы можете использовать ANY сдругой SQL техникой, например с техникой обьединения. Этот запрос будет находить все порядки со значением суммы меньшей чем значение любой суммы для заказчика в San Jose. (вывод показывается в Рисунке 13.7):

SELECT *

FROM Orders

WHERE amt < ANY ( SELECT amt

FROM Orders A, Customers b WHERE a.cnum = b.cnum

AND b.city = San Jose );

Даже если нименьший порядок в таблице был для заказчика из San Jose, то был второй наибольший; следовательно почти все строки будут выбраны. Простой способ запомнить, что <ANY значение меньшее чем наибольшее выбранное значение, а > ANY значение большее чем наименьшее выбранное значение.



1 ... 30 31 32 [ 33 ] 34 35 36 ... 95

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика