Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМП-БД.doc
Скачиваний:
17
Добавлен:
05.12.2018
Размер:
1.26 Mб
Скачать
  1. Вложенные запросы на чтение

В SQL существует понятие вложенный запрос, механизм вложенных запросов позволяет использовать результаты одного запроса в качестве составной части другого. Возможность применения одного запроса внутри другого и была причиной появления слова "структурированный" в названии "структурированный язык запросов". Понятие вложенного запроса не так широко известно, как понятие объединения, но оно играет важную роль SQL по трем следующим причинам:

• Оператор SQL с вложенным запросом зачастую является самым естественным способом выражения запроса, так как он лучше всего соответствует словесному описанию запроса.

• Вложенные запросы облегчают написание операторов select, поскольку они позволяют разбивать запрос на части (на запрос и вложенных запросы), а затем складывать эти части вместе.

• Существуют запросы, которые нельзя сформулировать на SQL, не прибегая к помощи вложенных запросов.

ПРИМЕНЕНИЕ ВЛОЖЕННЫХ ЗАПРОСОВ

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

"Вывести список офисов, в которых плановый объем продаж превышает сумму плановых объемов продаж всех служащих."

В данном запросе требуется получить список офисов из таблицы of fices, для которых значение столбца target удовлетворяет некотором условию. Логично предположить, что оператор select, выражающий данный запрос, должен выглядеть примерно так, как показано ниже.

Здесь величина "???" равна сумме плановых объемов продаж всех служащих, работающих в данном офисе. Как можно задать ее в этом запросе? Сумму плановых объемов продаж для отдельного офиса (скажем, офиса с идентификатором 21) можно получить с помощью следующего запроса:

Но как результаты этого запроса вставить в предыдущий запрос вместо вопросительных знаков? По-видимому, было бы разумно вначале написать первый запрос, а затем заменить символ "???"* вторым запросом:

Фактически это и есть правильный SQL-запрос. Вложенный (внутренний) запрос вычисляет для каждого офиса сумму плановых объемов продаж всех служащих, работающих в данном офисе. Главный (внешний) запрос сравнивает план продаж офиса с полученной суммой и, в зависимости от результата сравнения либо добавляет данный офис в таблицу результатов запроса, либо нет. Совокупно главный и вложенный запросы выражают исходный запрос и извлекают из базы данных требуемую информацию.

Вложенные SQL-запросы всегда выступают в качестве части предложения where или having. В предложении where они помогают отбирать из таблицы результатов запроса отдельные строки, а в предложении having — группы строк.

Что такое вложенный запрос

Вложенный запрос всегда заключается в круглые скобки, но по-прежнему сохраняет знакомую структуру оператора select, содержащего предложение from и необязательные предложения where, group by и having. Структура этих предложений во вложенном запросе идентична их структуре в операторе select; во вложенном запросе эти предложения выполняют свои обычные функции. Однако между вложенным запросом и оператором select имеется ряд отличий.

• Таблица результатов вложенного запроса всегда состоит из одного столбца. Это означает, что в предложении select вложенного запроса всегда указывается один возвращаемый столбец,

• Во вложенный запрос не может входить предложение order by. Результаты вложенного запроса используются только внутри главного запрос и для пользователя остаются невидимыми, поэтому нет смысла и сортировать.

• Вложенный запрос не может быть запросом на объединение нескольки:

различных операторов select; допускается использование только одной оператора select.

• Имена столбцов во вложенном запросе могут являться ссылками ш столбцы таблиц главного запроса. Эти внешние ссылки подробно рассматриваются ниже в настоящей главе.

ВЛОЖЕННЫЕ ЗАПРОСЫ В ПРЕДЛОЖЕНИИ WHERE

Чаще всего вложенные запросы указываются в предложении where оператора SQL. Когда вложенный запрос содержится в данном предложении, он участвует в процессе отбора строк. Рассмотрим еще раз пример запроса, приведенный в предьщущем параграфе.

Главный запрос считывает данные из таблицы offices, а его предложение where отбирает офисы, которые будут включены в таблицу результатов запроса. Условие, заданное в этом предложении, поочередно применяется ко всем строкам таблицы offices. Предложение where сравнивает значение текущей строки в столбце target со значением, возвращенным вложенным запросом. Для каждой строки результатов главного запроса выполняется вложенный запрос, который дает сумму плановых объемов продаж для служащих "текущего" офиса. Результатом вложенного запроса является одно число, и предложение where сравнивает его со значением столбца target, выбирая или отбрасывая текущий офис на основании результата сравнения. Как видно из рисунка, выполнение вложенного запроса повторяется для каждой строки, проверяемой предложением where главного запроса.