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

134 Понимание sql

______________________________________________________________________

ГЛ. 11

котором мы извлекли порядки усредненные для их заказчиков.

Обьединения, с другой стороны, могут выводить строки из обеих сравни-

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

предикатах внешних запросов. Как правило, форма запроса которая ка-

жется наиболее интуитивной будет вероятно лучшей в использовании, но

при этом хорошо бы знать обе техники для тех ситуаций когда та или иная

могут не работать.

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

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

понятий в SQL - соотнесенного подзапроса. Вы видели как соотнесенный

подзапрос связан с обьединение, а также, как как его можно использовать с

агрегатными функциями и в предложении HAVING. В общем, вы теперь

узнали все типы подзапросов полностью.

Следующий шаг - описание некоторых SQL специальных операторов. Они

берут подзапросы как аргументы, как это делает IN, но в отличие от IN, они

могут использоваться только в подзапросах. Первый из их, представленный

в Главе 12, - называется EXISTS.

СООТНЕСЕННЫЕ ПОДЗАПРОСЫ 135

______________________________________________________________________

*************** Работа с sql *************

1. Напишите команду SELECT использующую соотнесенный подзапрос,

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

для их городов оценками.

2. Напишите два запроса которые выберут всех продавцов ( по их имени

и номеру ) которые в своих городах имеют заказчиков которых они не

обслуживают. Один запрос - с использованием обьединения и один -

с соотнесенным подзапросом.

Которое из решений будет более изящным?

( Подсказка: один из способом это сделать, состоит в том, чтобы находить

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

находится ли каждый из них в городе продавца. )

( См. Приложение A для ответов. )

12

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

138 ПОНИМАНИЕ SQL

______________________________________________________________________

ГЛ. 12

ТЕПЕРЬ, КОГДА ВЫ ХОРОШО ОЗНАКОМЛЕНЫ С ПОДЗАПРОСАМИ,

мы можем говорить о некоторых специальных операторах которые всегда

берут подзапросы как аргументы. Вы узнаете о первом из их в этой главе.

Остальные будут описан в следующей главе.

Оператор EXISTS используется чтобы указать предикату, - производить ли

подзапросу вывод или нет. В этой главе, вы узнаете как использовать этот

оператор со стандартными и ( обычно ) соотнесенными подзапросами.

Мы будем также обсуждать специальные расмышления которые перейдут в

игру когда вы будете использовать этот оператор как относительный агрегат,

как пустой указатель NULL, и как оператор Буля. Кроме того, вы можете по-

высить ваш профессиональный уровень относительно подзапросов исследуя

их в более сложных прикладных программах чем те которые мы видели до

сих пор.

========== КАК РАБОТАЕТ EXISTS? ==========

EXISTS - это оператор, который производит верное или неверное

значение, другими словами, выражение Буля ( см. Главу 4 для обзора

этого термина ).

Это означает что он может работать автономно в предикате или в комбина-

ции с другими выражениями Буля использующими Булевы операторы AND,

OR, и NOT. Он берет подзапрос как аргумент и оценивает его как верный

если тот производит любой вывод или как неверный если тот не делает этого.

Этим он отличается от других операторов предиката, в которых1 он не может

быть неизвестным. Например, мы можем решить, извлекать ли нам некоторые

данные из таблицы Заказчиков если, и только если, один или более заказчи-

ков в этой таблице находятсяся в San Jose ( вывод для этого запроса показы-

вается в Рисунке 12.1 ):

SELECT cnum, cname, city

FROM Customers

WHERE EXISTS

( SELECT *

FROM Customers

WHERE city = " San Jose' );

Внутренний запрос выбирает все данные для всех заказчиков в San Jose.

Оператор EXISTS во внешнем предикате отмечает, что некоторый вывод

был произведен подзапросом, и поскольку выражение EXISTS было пол-

ным предикатом, делает предикат верным. Подзапрос( не соотнесенный )

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

ИСПОЛЬЗОВАНИЕ ОПЕРАТОРА EXISTS 139

______________________________________________________________________

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

| |

| SELECT snum, sname, city |

| FROM Customers |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers |

| WHERE city = 'San Jose'); |

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

| cnum cname city |

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

| 2001 Hoffman London |

| 2002 Giovanni Rome |

| 2003 Liu San Jose |

| 2004 Grass Berlin |

| 2006 Clemens London |

| 2008 Cisneros San Jose |

| 2007 Pereira Rome |

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

Рисунок 12.1 Использование оператора EXISTS

тельно имеет одно значение во всех случаях. Поэтому EXISTS, когда исполь-

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

сразу, что это не так уж полезно для извлечения определенной информации.

ВЫБОР СТОЛБЦОВ С ПОМОЩЬЮ EXISTS

В вышеупомянутом примере, EXISTS должен быть установлен так чтобы

легко выбрать один столбец, вместо того, чтобы выбирать все столбцы

используя в выборе звезду( SELECT *) В этом состоит его отличие от

подзапроса который ( как вы видели ранее в Главе 10 мог выбрать толь-

ко один столбец ) .

Однако, в принципе он мало отличается при выборе EXISTS столбцов,

или когда выбираются все столбцы, потому что он просто замечает -

выполняется или нет вывод из подзапроса - а не использует выведен-

ные значения.

ИСПОЛЬЗОВАНИЕ EXISTS С

СООТНЕСЕННЫМИ ПОДЗАПРОСАМИ

В соотнесенном подзапросе, предложение EXISTS оценивается отдельно

для каждой строки таблицы имя которой указано во внешнем запросе,

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

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