ТОП 10:

Подзапрос, виды подзапросов (определение, перечислить с указанием допустимых операторов для объединения с главным запросом, перечисть разделы оператора SELECT, где могут использоваться).



Вложенный подзапрос – это оператор SELECT, заключенный в круглые скобки и вложенный в команду языка DML, и использующийся в качестве источника данных для параметров SELECT, FROM, WHERE и HAVING. Каждый подзапрос в свою очередь может содержать в себе подзапрос и т.д. В каждой СУБД существуют ограничения на количество вложенных подзапросов, но обычно этих ограничений хватает, чтобы реализовать задачи любой известной сложности.

Например, чтобы определить, уровень продаж каких товаров превышает средний уровень, необходимо предварительно вычислить этот средний уровень.

Все подзапросы можно условно разделить на однострочные и многострочные, а также на простые и коррелированные.

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

Многострочные запросы в общем случае могут вернуть любое количество строк, поэтому над результатами таких подзапросов нельзя использовать операции сравнения (если один из аргументов операции сравнения будет являться пустым множеством или множеством, состоящим более чем из одного элемента, то запрос завершиться с ошибкой). Для таких подзапросов применимы операторы IN и EXISTS.

Простыми, или независимыми, подзапросами называются вложенные подзапросы, выполнение которых не зависит от внешнего запроса. Простые вложенные подзапросы обрабатываются системой «снизу вверх». Первым обрабатывается вложенный подзапрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации подзапроса более высокого уровня и т.д.

Запросы с коррелированными вложенными подзапросами обрабатываются системой в обратном порядке. Сначала выбирается первая строка рабочей таблицы, сформированной основным запросом, и из нее выбираются значения тех столбцов, которые используются во вложенном подзапросе (вложенных подзапросах). Если эти значения удовлетворяют условиям вложенного подзапроса, то выбранная строка включается в результат. Затем выбирается вторая строка и т.д., пока в результат не будут включены все строки, удовлетворяющие вложенному подзапросу (последовательности вложенных подзапросов).

Однострочные вложенные подзапросы

Однострочные вложенные подзапросы чаще всего применяются совместно с агрегатными функциями, результат вычисления которых и является единственным результатом подзапроса. Например:

-- получить имя менеджера, имеющего максимальное

-- значение размера комиссионных

SELECT Name FROM Managers WHERE Procent =

(SELECT Max(Procent) FROM Managers);

В данном случае вложенный подзапрос должен выполняться для каждой строки, обрабатываемой во внешнем запросе. Но очевидно, что результат вложенного запроса никоим образом не зависит от того, какая строка обрабатывается во внешнем запросе. В таких случаях, чтобы не выполнять один и тот же вложенный подзапрос, независящий от внешнего запроса, некоторые СУБД кэшируют (запоминают) результат, полученный в результате первого выполнения вложенного подзапроса, и подставляют для всех остальных строк таблиц, обрабатываемых во внешнем запросе.

-- получить имя менеджера, осуществившего

-- максимальное количество сделок продажи

SELECT Name FROM Managers

WHERE Man_id=

(SELECT Man_id FROM Outgoing

WHERE ROWNUM=1

GROUP BY Man_id

HAVING COUNT(Out_id)=

(SELECT MAX(COUNT(Out_id)) FROM Outgoing

GROUP BY Man_id));

В данном запросе в параметре WHERE указано условие ROWNUM=1, благодаря которому соблюдается условие выбора единственного значения во вложенном подзапросе, иначе вложенный подзапрос может вернуть более одной строки (если несколько менеджеров осуществили максимальное количество сделок), тогда результат выполнения подзапроса нельзя будет использовать в операциях сравнения. О способах применения столбца ROWNUM для частичного вывода запрошенных данных смотри далее раздел «Частичный вывод запрошенных данных».

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







Последнее изменение этой страницы: 2017-01-25; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.236.245.255 (0.003 с.)