Скачиваний:
25
Добавлен:
01.04.2014
Размер:
761.34 Кб
Скачать

Использование count вместо exists

Подчеркнем, что все формулировки с ANY и ALL могут быть в точности

выполнены с EXISTS, в то время как наоборот будет неверно. Хотя в этом

случае, также верно и то что EXISTS и NOT EXISTS подзапросы могут

обманывать при выполнении тех же самых подзапросов с COUNT(*)

в предложения SELECT подзапроса. Если больше чем ноль строк выводе

будет подсчитано, это эквивалентно EXISTS; в противном случае это рабо-

тает также как NOT EXISTS. Следующее является этому примером (вывод

показывается в Рисунке 13.12 ):

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ ANY, ALL, И SOMI: 165

______________________________________________________________________

SELECT *

FROM Customers outer

WHERE NOT EXISTS

( SELECT *

FROM Customers inner

WHERE outer.rating < = inner.rating

AND inner.city = 'Rome' );

=============== SQL Execution Log ============

| |

| SELECT * |

| FROM Customers outer |

| WHERE NOT EXISTS |

| (SELECT * |

| FROM Customers inner |

| WHERE outer.rating <= inner.rating |

| AND inner.city = 'Rome'); |

| ============================================= |

| cnum cname city rating snum |

| ----- -------- ---- ------ ------ |

| 2004 Grass Berlin 300 1002 |

| 2008 Cisneros San Jose 300 1007 |

=============================================

Рисунок 13.12: Использование EXISTS с соотнесенным подзапросом

Это должно также быть выполнено как

SELECT *

FROM Customers outer

WHERE 1 >

( SELECT COUNT (*)

FROM Customers inner

WHERE outer.rating < = inner.rating

AND inner.city = 'Rome' );

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

Теперь Вы начинаете понимать сколько способов имеется в SQL. Если

это все кажется несколько путанным на этой стадии, нет причины волно-

ваться. Вы обучаетесь чтобы использовать ту технику которая лучше всего

отвечает вашим требованиям и наиболее понятна для вас.

Начиная с этого места, мы хотим показать Вам большое количество воз-

можностей, что бы вы могли найти ваш собственный стиль.

166 Понимание sql

______________________________________________________________________

ГЛ. 13

=============== SQL Execution Log ============

| |

| SELECT * |

| FROM Customers outer |

| WHERE 1 > |

| (SELECT COUNT (*) |

| FROM Customers inner |

| WHERE outer.rating <= inner.rating |

| AND inner.city = 'Rome'); |

| ============================================= |

| cnum cname city rating snum |

| ----- -------- ---- ------ ------ |

| 2004 Grass Berlin 300 1002 |

| 2008 Cisneros San Jose 300 1007 |

=============================================

Рисунок 13.13: Использование COUNT вместо EXISTS

============== РЕЗЮМЕ ================

Итак, вы прошли много чего в этой главе. Подзапросы не простая тема,

и мы потратили много время чтобы показать их разновидности и неодноз-

начности. То чему Вы теперь научились, вещи достаточно глубокие.

Вы знаете несколько технических решений одной проблемы, и поэтому вы

можете выбрать то которое более подходит вашим целям. Кроме того, вы

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

(NULL) и ошибки.

Теперь, когда вы полностью изучили запросы, наиболее важный, и вероятно

наиболее сложный, аспект SQL, объем другого материала будет относительно

прост для понимания.

Мы имеем еще одну главу о запросах, которая покажет вам как объединить

выводы любого числа запросов в единое тело, с помощью формирования

объединения многочисленых запросов используя оператор UNION.

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ ANY, ALL, SOME 167

______________________________________________________________________

Соседние файлы в папке ПОНИМАНИЕ SQL