Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практические SQL запросы на выборку.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
9.64 Mб
Скачать

Контрольные вопросы:

  1. Как можно использовать соотнесенный подзапрос?

  2. Что такое подзапрос?

  3. Как можно вывести много строк в подзапросе?

  4. Агрегатные функции в подзапросе?

Практическая работа

Тема: Запросы SQL (часть4)

Цель:

  1. Использование оператора EXISTS

  2. Использование операторов ANY, ALL и SOME.

Оборудование и/или программное обеспечение:IBM PC, MS Access /OpenOfficedBase.

Теоретическая и практическая часть Использование оператора exists

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

Как работает exists?

EXISTS - это оператор, который производит верное или неверное значение, другими словами, выражение Буля. Это означает что он может работать автономно в предикате или в комбинации с другими выражениями Буля использующими Булевы операторы AND, OR, и NOT. Он берет подзапрос как аргумент и оценивает его как верный если тот производит любой вывод или как неверный если тот не делает этого. Этим он отличается от других операторов предиката, в которых он не может быть неизвестным. Например, мы можем решить, извлекать ли нам некоторые данные из таблицы Заказчиков если, и только если, один или более заказчиков в этой таблице находятся в San_Jose ( вывод для этого запроса показывается в Рисунке 1 ):

SELECT cnum, cname, city FROM Customers WHERE EXISTS ( SELECT * FROM Customers WHERE city = ‘San Jose' );

Внутренний запрос выбирает все данные для всех заказчиков в San Jose. Оператор EXISTS во внешнем предикате отмечает, что некоторый вывод был произведен подзапросом, и поскольку выражение EXISTS было полным предикатом, делает предикат верным. Подзапрос был выполнен только один раз для всего внешнего запроса, и следовательно имеет одно значение во всех случаях. Поэтому EXISTS, когда используется этим способом, делает предикат верным или неверным для всех строк сразу, что это не так уж полезно для извлечения определенной информации.

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

Выбор столбцов с помощью exists

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

Комбинация из exists и объединения

Однако для нас может быть полезнее вывести больше информации об этих продавцах, а не только их номера. Мы можем сделать это объединив таблицу Заказчиков с таблицей Продавцов (вывод для запроса показывается в Рисунке 3):

SELECT DISTINCT first.snum, sname, first.city

FROM Salespeople first, Customers second

WHERE EXISTS

( SELECT *

FROM Customers third

WHERE second.snum = third.snum

AND second.cnum <> third.cnum )

AND first.snum = second.snum;

Рисунок 2 Комбинация EXISTS с объединением

Внутренний запрос здесь - как и в предыдущем варианте, фактически сообщает, что псевдоним был изменен. Внешний запрос - это объединение таблицы Продавцов с таблицей Заказчиков, наподобие того что мы видели прежде. Новое предложение основного предиката (AND first.snum = second.snum ) естественно оценивается на том же самом уровне что и предложение EXISTS. Это - функциональный предикат самого объединения, сравнивающий две таблицы из внешнего запроса в терминах поля snum, которое являются для них общим. Из-за Булева оператора AND, оба условия основного предиката должны быть верны в порядке для верного предиката. Следовательно, результаты подзапроса имеют смысл только в тех случаях когда вторая часть запроса верна, а объединение - выполняемо. Таким образом комбинация объединения и подзапроса может стать очень мощным способом обработки данных.