- •Iso (международной организацией по
- •2 Понимание sql
- •Что такое - реляционная база данных?
- •Порядок строк произволен
- •4 Понимание sql ___________________________________________________________________
- •Идентификация строк ( первичные ключи )
- •Столбцы именуются и нумеруются
- •8 Понимание sql
- •************** Работа с sql **************
- •Sql : обзор
- •Что делает ansi ?
- •Интерактивный и вложенный sql
- •14 Понимание sql
- •Субподразделения sql
- •16 Понимание sql
- •Sql несогласованности
- •Что такое - пользователь?
- •18 Понимание sql
- •Условия и терминология
- •************** Работа с sql **************
- •24 Понимание sql
- •26 Понимание sql
- •Переупорядочение столбца
- •28 Понимание sql
- •Параметры distinct
- •30 Понимание sql
- •32 Понимание sql
- •************* Работа с sql ***************
- •38 Понимание sql
- •40 Понимание sql
- •42 Понимание sql
- •44 Понимание sql
- •Использование специальных операторов в условиях
- •50 Понимание sql
- •52 Понимание sql
- •54 Понимание sql
- •56 Понимание sql
- •************** Работа с sql **************
- •Обобщение данных с помощью агрегатных функций
- •64 Понимание sql
- •66 Понимание sql
- •Включение дубликатов в агрегатные функции
- •Предложение group by
- •68 Понимание sql
- •Предложение having
- •70 Понимание sql
- •72 Понимание sql
- •************** Работа с sql **************
- •Формирование выводов запросов
- •Помещение текста в вашем выводе запроса
- •78 Понимание sql
- •80 Понимание sql
- •82 Понимание sql
- •Упорядочение вывода по номеру столбца
- •84 Понимание sql
- •************** Работа с sql **************
- •Запрашивание многочисленых таблиц также как одной
- •90 Понимание sql
- •92 Понимание sql
- •94 Понимание sql
- •************** Работа с sql **************
- •Объединение таблицы с собой
- •Псевдонимы
- •100 Понимание sql
- •Устранение избыточности
- •102 Понимание sql
- •Больше псевдонимов
- •104 Понимание sql
- •106 Понимание sql
- •************** Работа с sql **************
- •Вставка одного запроса внутрь другого
- •112 Понимание sql
- •114 Понимание sql
- •116 Понимание sql
- •In определяет набор значений, одно из которых должно совпадать с другим
- •118 Понимание sql
- •In является подходящим, если запрос может ограниченно производить одно
- •120 Понимание sql
- •122 Понимание sql
- •*************** Работа с sql *************
- •Соотнесенные подзапросы
- •130 Понимание sql
- •132 Понимание sql
- •Соотнесенные подзапросы в предложении having
- •134 Понимание sql
- •*************** Работа с sql *************
- •Использование оператора exists
- •140 Понимание sql
- •142 Понимание sql
- •144 Понимание sql
- •146 Понимание sql
- •************** Работа с sql **************
- •Использование оператора exists
- •152 Понимание sql
- •154 Понимание sql _____________________________________________________________________
- •156 Понимание sql
- •158 Понимание sql
- •160 Понимание sql
- •162 Понимание sql
- •Использование count вместо exists
- •166 Понимание sql
- •************** Работа с sql **************
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 оценивается отдельно
для каждой строки таблицы имя которой указано во внешнем запросе,
точно также как и другие операторы предиката, когда вы используете