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

2.2 Подзапросы

Подзапрос – это оператор SELECT, включенный в другие запросы. Подзапросы применяются для разбивки сложного запроса на серию логических этапов. Их применение эффективно, если запрос использует записи, возвращенные другим запросом.

В качестве примера возьмем две таблицы:

Ученые

Код ученого

Фамилия

Имя

Паспорт

Кураторство

Дата рождения

SC001

Ландау

Лев

2504 111111

1121

09.01.1908

SC002

Хокинг

Стив

2601 222222

1123

08.01.1942

SC003

Кулон

Шарль-Огюстен

2009 333333

1121

14.06.1736

SC004

Резерфорд

Эрнест

3802 444444

1322

30.08.1871

SC005

Рентген

Вильгельм-Конрад

2101 555555

1121

27.03.1845

SC006

Фарадей

Майкл

2804 666666

1322

22.09.1791

SC007

Шрёдингер

Эрвин

2502 777777

1121

12.08.1887

Расписание

Код занятий

Предмет

Преподаватель

Группа

Время

SC001

Теоретическая механика

SC001

1121

25.01.2013 08:30

SC002

Астрономия

SC002

1123

16.12.2001 10:00

SC003

Электростатика

SC003

1121

01.12.2011 17:00

SC004

Небесная механика

SC002

1322

08.10.2013 12:00

SC005

Электростатика

SC005

1122

13.12.2013 15:00

SC006

Теоретическая механика

SC001

1322

01.12.2011 10:20

SC007

Электростатика

SC005

1121

01.12.2011 17:00

Существует два вида подзапросов.

  1. Вложенные подзапросы – возвращают единственное значение либо список значений. Вложенный запрос выполняется один раз, а затем результирующее значение используется во внешнем запросе.

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

Например, чтобы определить имена и фамилии ученых, данные о котором находятся в подзапросе, запишем следующий запрос:

SELECT Имя+ ' ' + Фамилия AS 'Имя преподавателя', Паспорт

FROM Ученые

WHERE [Код ученого] in

(SELECT Преподаватель

FROM Расписание

WHERE Группа=1221)

Выполнение этого запроса осуществляется в два этапа: на первом – осуществляется выполнение подзапроса, как самостоятельного запроса, который возвращает значение, используемое на втором этапе при выполнении внешнего запроса.

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

  1. Связанные подзапросы – используются данные внешнего запроса, причем связанный запрос выполняется один раз для каждой записи внешнего запроса.

Например, для определения списка всех преподавателей, которые курировали группу 1121 (за всю историю существования факультета), необходимо выполнить следующий запрос:

SELECT Фамилия, Имя

FROM Ученые U

WHERE [Код ученого] IN (SELECT Преподаватель

FROM Расписание T

WHERE U.[Код ученого] = T.Преподаватель)

В связанных подзапросах, чтобы различать имена таблиц необходимо применять их псевдонимы. В примере для таблицы SalesOrderHeader определен псевдоним U, а для SalesOrderDetailT.

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