|
Программирование >> Построение запросов sql
Рис. 3.77. Результат соединения таблицы со своей копией и другой таблицей 3.3.2. Запросы с вложенными запросами 3.3.2.1. Виды вложенных запросов Вложенный запрос - это запрос, заключенный в круглые скобки и вложенный в предложение WITH, SELECT, FROM, WHERE или HAVING основного (внешнего) запроса SELECT или других запросов, использующих эти предложения. Вложенный запрос также называют подзапросом. Вложенный запрос в своих предложениях может содержать другой вложенный запрос и т. д. Условно подзапросы подразделяют на три типа, каждый из которых является сужением предыдущего: <табличный подзапрос> ::= запрос SELECT, возвращающий набор строк и столбцов; <подзапрос столбца> ::= запрос SELECT, возвращающий значения только одного столбца, но, возможно, в нескольких строках; <скалярный подзапрос> ::= запрос SELECT, возвращающий значение одного столбца в одной строке. Использование подзапросов в предложении WITH имеет следующий вид: WITH [RECURSIVE] имя производной таблицы1 [(<список столбцов>)] AS (<табличный подзапрос> ) [, имя производной таблицы2 [(<список столбцов>)] AS (<табличный подзапрос>)]... . При использовании вложенных запросов в предложении SELECT синтаксис возвращаемых элементов имеет следующий вид: <возвращаемый элемент> :: = { [<таблица>].* [<таблица>.] столбец константа <выражение> (<скалярный подзапрос>) } . При использовании вложенных запросов в предложении FROM его синтаксис имеет следующий вид: FROM <производная таблица1> [,<производная таблица2> где <производная таблица> (<табличный подзапрос>) [[AS] псевдоним] [(<список столбцов>)] . При использовании вложенных запросов в предложениях WHERE и HAVING изменяется синтаксис некоторых условий поиска. Простое сравнение при использовании вложенного запроса реализуется следующей конструкцией: <значение> <операция сравнения> { <значение1> (<скалярный подзапрос>) {aNY ALL} (<подзапрос столбца>)}. Проверка на членство в множестве реализуется следующей конструкцией: <значение> [NOT] IN ({<значение1> [ , <значение2> <подзапрос столбца>} ). Также при использовании вложенных запросов есть возможность осуществлять проверку на существование с помощью предиката EXISTS и проверку на возврат подзапросом единственного значения с помощью предиката SINGULAR. Условие поиска с проверкой существования представляется в следующем виде: NOT] EXISTS (<табличный подзапрос>). Условие поиска с проверкой на единственное возвращаемое значение представляется в следующем виде: SINGULAR (<табличный подзапрос>). Использование конструкций FIRST, SKIP, PLAN, ORDER BY и ROWS разрешено для любого подзапроса. Существуют простые и соотнесенные (связанные) вложенные запросы. В предложениях SELECT, WHERE и HAVING могут использоваться и простые, и соотнесенные вложенные запросы, а в предложении FROM только простые вложенные запросы. В предложение WHERE (или HAVING) как простые, так и соотнесенные вложенные запросы включаются с помощью предикатов IN, EXISTS или одной из операций сравнения ( = <> < <= > >= ). Следует отметить, что выражения, содержащие подзапрос в предложениях WHERE или HAVING, используются наиболее часто. Простым вложенным запросом называется такой, результат которого не зависит от внешнего запроса. Данные из таблиц, указанных в предложениях FROM внешнего запроса и подзапроса, извлекаются независимо друг от друга, вследствие чего необязательно вводить псевдонимы для этих таблиц или указывать полные имена столбцов. Простые вложенные запросы обрабатываются системой снизу- вверх . Первым обрабатывается вложенный запрос самого нижнего уровня. Множество значений, полученное в результате его выполнения, используется при реализации запроса более высокого уровня и т.д. Связанным вложенным запросом называется такой, результат которого зависит от результата внешнего запроса. Подзапрос является связанным, когда в нем (в предложениях WHERE, HAVING) указан столбец таблицы внешнего запроса. Такое обращение к столбцам внешнего запроса называется внешней ссылкой. Если быть точнее, внешняя ссылка - это имя столбца одной из таблиц, указанных в предложении FROM внешнего запроса, но не входящего ни в одну из таблиц предложения FROM подзапроса. В связанных подзапросах следует указывать полные имена столбцов, причем если во внешнем и вложенном запросах используется одна и та же таблица, то для столбцов должны быть заданы псевдонимы. Запросы со связанными вложенными запросами обрабатываются в обратном порядке ( сверху-вниз ), т. е. сначала выбирается первая строка рабочей таблицы, сформированная основным запросом. Затем из нее выбираются значения тех столбцов, которые используются в подзапросе (подзапросах). Если эти значения удовлетворяют условиям вложенного запроса, то выбранная строка включается в результат. После этого во внешнем запросе выбирается вторая строка и т. д., пока в результат не будут включены все строки, удовлетворяющие подзапросу (последовательности подзапросов). 3.3.2.2. Запросы с простыми подзапросами 3.3.2.2.1. Простые подзапросы в предложении WITH Производные таблицы, возвращаемые табличным подзапросом, могут быть определены в предложении WITH, которое записывается перед основным запросом SELECT. Синтаксис использования предложения WITH следующий: WITH [RECURSIVE] имя производной таблицы1 [(<список столбцов>)] AS (<табличный подзапрос> ) [, имя производной таблицы2 [(<список столбцов>)] AS (<табличный подзапрос>)]... Как следует из приведенного синтаксиса, в предложении WITH может быть определено несколько подзапросов. Сами предложения WITH не могут быть вложенными. Подзапросы в предложении WITH могут быть нерекурсивными и рекурсивными. Если используется рекурсивный подзапрос, то в предложении WITH указывается ключевое слово RECURSIVE.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |