Программирование >>  Sql: полное руководство 

1 ... 58 59 60 [ 61 ] 62 63 64 ... 264


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

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

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

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

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

Применение подчиненных запросов

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

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

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

SELECT CITY FROM OFFICES WHERE TARGET > ???

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

SELECT SOM(QUOTA) FROM SALESREPS WHERE REP OFFICE =21

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

SELECT CITY FROM OFFICES



where target > (select sum(quota) from salesreps where rep office = office)

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

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

Что такое подчиненный запрос

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

.(SELECT

ALL-

. DISTINCT-

возвращавмы0 столбвц

-> FROM-

спецификатор та6лицы --,-

-►WHERE условив отбора

GROUP BY

столбвц группировки

->- HAVING условие отбора

Рис 9.1. Синтаксическая диаграмма подчиненного запроса



Между подчиненным запросом и инструкцией select имеется ряд отличий.

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

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

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

Подчиненный запрос не может быть запросом на объединение (union) нескольких различных инструкций select; допускается использование только одной инструкции select. (Стандарт SQL2 ослабляет это ограничение, позволяя, как будет показано ниже, создавать гораздо более мощные запросы.)

Подчиненные запросы в предложении WHERE

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

Вывести список служащих, чей плановый объем продаж составляет менее 10% от планового объема продаж всей компании.

SELECT NAME

FROM SALESREPS WHERE QUOTA < (.1 * (SELECT SUM(TARGET) / FROM OFFICES))

NAME

Bob Smith

В данном случае подчиненный запрос вычисляет сумму плановых объемов продаж всех офисов, которая затем умножается на 0,1 (10%). Полученное значение используется в условии отбора при сканировании таблицы salesreps на предмет поиска нужных строк. В показанном примере подчиненный запрос возвращает для каждой строки одно и то же значение. По сути, вы самостоятельно могли бы произвести соответствующие вычисления, подсчитать план компании ($275000) и упростить условие отбора:

WHERE QUOTA < 275000

Конечно, подчиненные запросы далеко не всегда столь просты. Рассмотрим еще раз пример запроса, приведенный в предьщущем параграфе:

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

SELECT CITY PROM OFFICES



1 ... 58 59 60 [ 61 ] 62 63 64 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика