- •Лабораторная работа 4. Подчиненные и составные запросы
- •Общие сведения
- •Применение подчиненных запросов
- •Подчиненный запрос
- •Подчиненные запросы в предложении where
- •Условия отбора в подчиненном запросе
- •Сравнение с результатом подчиненного запроса
- •Проверка на принадлежность результатам подчиненного запроса
- •Проверка на существование
- •Уровни вложенности запросов
- •Подчиненные запросы — резюме
Подчиненные запросы в предложении where
Чаще всего подчиненные запросы указываются в предложении WHERE инструкции SQL. Когда подчиненный запрос содержится в данном предложении, он участвует в процессе отбора строк. В простейшем случае подчиненный запрос является частью условия отбора и возвращает значение, позволяющее проверить истинность или ложность условия.
Пример 4.2. Вывести информацию о наименовании поставщика, коде проекта и объемах поставки, для которых объем поставки меньше, чем 50% среднего объема поставок по всем поставкам.
select Sname,KID, Quantity
from Delivery join Supplier on (Delivery.SID = Supplier.SID)
where Quantity < (0.5 * (select avg(Quantity)
from Delivery))
Результат:
Sname KID Quantity
-------------------- ----------- -----------
Информатика 1 100
Информатика 4 200
Вист-Дон 3 200
Вист-Дон 5 100
Вист-Дон 7 200
Sunrise 2 100
Формоза 5 100
В данном случае подчиненный запрос вычисляет средний объем поставки по всем поставкам, который затем умножается на 0,5 (50 %). Полученное значение используется в условии отбора при сканировании объединенных таблиц Delivery и Supplier на предмет поиска нужных строк. В примере 4.2 подчиненный запрос возвращает для каждой строки одно и то же значение.
Условия отбора в подчиненном запросе
Подчиненный запрос всегда является частью условия отбора в предложении и WHERE или HAVING. В SQL используются следующие условия отбора в подчиненном запросе:
-
сравнение с результатом подчиненного запроса. Значение выражения сравнивается с одним значением, которое возвращается подчиненным запрос. Эта проверка напоминает простое сравнение;
-
проверка на принадлежность результатам подчиненного запроса. Значение выражения проверяется на равенство одному из множества значений, которые возвращаются подчиненным запросом. Эта проверка напоминает простую проверку на членство в множестве;
-
проверка на существование. Проверяется наличие строк в таблице результатов подчиненного запроса;
-
многократное сравнение. Значение выражения сравнивается с каждым из множества значений, которые возвращаются подчиненным запросом.
Сравнение с результатом подчиненного запроса
Сравнение с результатом подчиненного запроса является модифицированной формой простого сравнения. Значение выражения сравнивается со значением, которое возвращается подчиненным запросом, и если условие сравнения выполняется, то проверка дает результат TRUE. Эта проверка используется для сравнения значения из проверяемой строки с одним значением, полученным от подчиненного запроса. Примеры SQL – запросов, использующих сравнение с результатом подчиненного запроса были рассмотрены в примерах 4.1 и 4.2.
Проверка на принадлежность результатам подчиненного запроса
Проверка на принадлежность результатам подчиненного запроса (предикат IN) является видоизмененной формой простой проверки на членство в множестве. Одно значение сравнивается со столбцом данных, которые возвращаются подчиненным запросом, и если это значение равно одному из элементов столбца, проверка дает результат TRUE. Данная проверка используется, когда необходимо сравнить значение из проверяемой строки с множеством значений, отобранных подчиненным запросом.
Пример 4.4. Вывести информацию о наименовании поставщиков, которые участвуют в поставках для проекта с кодом 1.
select Sname
from Supplier
where SID in (select SID
from Delivery
where KID=1)
Результат:
Sname
------------
Информатика
Вист-Дон
Формоза
Подчиненный запрос возвращает список кодов поставщиков, клоторые участвуют в поставках для проекта с кодом, равным 1 . Главный запрос затем проверяет каждую строку таблицы Supplier чтобы определить наименование поставщика, соответствующее выбранному коду.
Во всех приведенных примерах подчиненный запрос возвращает в качестве результата столбец данных, а предложение WHERE главного запроса проверяет, равно ли значение из строки таблицы главного запроса одному из значений в получен ном столбце. Таким образом, проверка IN с подчиненным запросом выполняете аналогично простой проверке IN, за исключением того, что множество значений задается подчиненным запросом, а не указывается явно в инструкции SELECT.