Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных / БД2012 / Understanding.SQL.doc
Скачиваний:
281
Добавлен:
28.03.2015
Размер:
1.75 Mб
Скачать

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

Подчеркнем, что все формулировки с ANY и ALL могут быть в точности выполнены с EXISTS, в то врем как наоборот будет неверно. Хотя в этом случае, также верно и то что EXISTS и NOT EXISTS подзапросы могут обманывать при выполнении тех же самых подзапросов с COUNT(*) в предложении SELECT подзапроса. Если больше чем ноль строк выводе будет подсчитано, это эквивалентно EXISTS; в противном случае это работает также как NOT EXISTS. Следующее является этому примером (вывод показывается в Рисунке 13.12 ):

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

=============== 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.

Соседние файлы в папке БД2012