Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Неделя 08 Лекция 1 (12).doc
Скачиваний:
6
Добавлен:
13.11.2019
Размер:
173 Кб
Скачать
☆

12.2. Дополнительные возможности использования подзапросов, возвращающих единичное значение.

12.2.1. Использование предложения exists.

Бывают случаи, когда в условии поиска нужно указать, что из таблицы требуется отобрать только те записи, для которых подзапрос возвращает одно или более значений. В этом случае в условии поиска указывается предложение

EXISTS (<подзапрос>)

Ключевые слова EXISTS и NOT EXISTS предназначены для использования только совместно с подзапросами. Результат их обработки равен TRUE или FALSE. Для ключевого слова EXISTS результат равен TRUE только тогда, когда в возвращаемой подзапросом результирующей таблице присутствует хотя бы одна строка. Если результирующая таблица подзапроса пуста, результатом обработки будет FALSE. Для NOT EXISTS правила обратные.

ПРИМЕР

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

SELECT Code, Name

FROM Books

WHERE Code IN (SELECT BookCode

FROM BookInventaryNumbers

WHERE FundCode = 2 AND

EXISTS (SELECT Code

FROM BookGiveOutRecord)

WHERE InventaryCode =

BookInventaryNumbers.Code))

Результат выполнения запроса приведен в таблице 12.3.

Таблица 12.3.

Code

Name

6

Автоматизированные системы управления технологическим процессом обогащения руды

12.2.2. Использование предложения singular.

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

SINGULAR (<onepaтop_seIect >)

ПРИМЕР

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

SELECT Code, Name

FROM Books

WHERE Code IN (SELECT BookCode

FROM BookInventaryNumbers

WHERE FundCode = 2 AND

SINGULAR (SELECT Code

FROM BookGiveOutRecord

WHERE InventaryCode =

BookInventaryNumbers.Code))

Результат выполнения запроса приведен в таблице 12.4.

Таблица 12.4.

Code

Name

6

Автоматизированные системы управления технологическим процессом обогащения руды

Результаты совпадают с примером для слова EXISTS только потому, что заданному условию в таблице BookGiveOutRecord Соответствует только одна запись.

12.3. Использование подзапросов, возвращающих множество значений.

12.3.1. Использование предложений all, some, any.

Если в условиях поиска необходимо указать, что сравниваемое значение (значение столбца, результат вычисления выражения) должно находиться в определенных отношениях со всеми значениями из множества значений, возвращаемых подзапросом, применяют предложение типа

<сравниваемое значение> [NOT] <оператор> {ALL | SOME | ANY} (<подзапрос>)

где подзапрос может возвращать более одного значения. Оператор определяет операцию сравнения (>, >=, < и т.д.). Отношение сравниваемого значения и значений, возвращаемых подзапросом, устанавливается словами ALL и SOME (ANY).

ALL определяет, что условие поиска истинно, когда сравниваемое значение находится в отношении, определяемом оператором, со всеми значениями, возвращаемыми подзапросом. Например:

WHERE STOLBEZ > ALL (SELECT POLE FROM TABLIZA)

определяет, что текущее значение столбца STOLBEZ должно быть больше всех значений в столбце с именем POLE из таблицы с именем TABLIZA.

SOME (вместо него можно указать ANY) говорит, что условие поиска истинно, когда сравниваемое значение находится в отношении, определяемом оператором, хотя бы с одним значением, возвращаемым подзапросом. Например:

WHERE STOLBEZ > SOME (SELECT POLE FROM TABLIZA)

определяет, что текущее значение столбца STOLBEZ должно быть больше хотя бы одного значения в столбце POLE из таблицы TABLIZA.

ПРИМЕР

Найдите инвентарные номера всех книг, чья стоимость превышает стоимость хотя бы одной книги книжного фонда под номером «1».

SELECT BookCode, InventaryNumber, Cost

FROM BookInventaryNumbers

WHERE Cost > SOME (SELECT Cost

FROM BookInventaryNumbers

WHERE FundCode = ‘1’)

Хотя этот запрос может быть записан с использованием подзапроса, определяющего минимальную стоимость книг книжного фонда под номером «1», после чего внешний подзапрос сможет выбрать сведения о всех книгах, чья стоимость превосходит это значение, возможен и другой подход, заключающийся в использовании ключевых слов SOME / ANY.

В этом случае внутренний подзапрос создает набор числовых значений {15.56, 22.33, 34.01, 12.99}, а внешний запрос выбирает сведения о тех книгах, цена которых больше любого из значений в этом наборе (фактически, больше минимального значения – 12.99). Подобный альтернативный метод можно считать более естественным, чем определение в подзапросе минимальной цены.

Результаты выполнения запроса представлены в таблице 12.5

Таблица 12.5.

BookCode

InventaryNumber

Cost

1

4567890

15.56

2

4510000

22.33

3

4532477

34.01

5

4678532

56.78

ПРИМЕР

Найдите инвентарные номера всех книг, чья стоимость превышает стоимость любой книги книжного фонда под номером «1».

SELECT BookCode, InventaryNumber, Cost

FROM BookInventaryNumbers

WHERE Cost > ALL (SELECT Cost

FROM BookInventaryNumbers

WHERE FundCode = «1»)

В целом этот запрос подобен предыдущему. И в данном случае можно было бы использовать подзапрос, определяющий максимальное значение стоимости книг из фонда под номером ‘1’, после чего с помощью внешнего запроса выбрать сведения обо всех книгах, стоимость которых превышает это значение. Однако в данном примере выбран подход с использованием ключевого слова ALL.

Результаты выполнения запроса представлены в таблице 12.6.

Таблица 12.6.

BookCode

InventaryNumber

Cost

5

4578532

56.78