Понятие подзапроса

Сложные запросы

Часто невозможно решить поставленную задачу путем одного запроса. Это особенно актуально, когда при использовании условия поиска в предложении WHERE значение, с которым надо сравнивать, заранее не определено и должно быть вычислено в момент выполнения оператора SELECT. В таком случае приходят на помощь операторы SELECT, внедренные в тело другого оператора SELECT. Внутренний подзапрос представляет собой также оператор SELECT, а написание его предложений подчиняется тем же правилам, что основной оператор SELECT. Внешний оператор SELECT использует результат выполнения внутреннего оператора для определения содержания окончательного результата всей операции. Внутренние запросы могут быть помещены непосредственно после оператора сравнения (=, <, >, <=, >=, <>) в предложения WHERE и HAVING внешнего оператора SELECT – они получают название подзапросов или вложенных запросов. Кроме того, внутренние операторы SELECT могут применяться в операторах INSERT, UPDATE и DELETE.

Подзапрос – это запрос, заключенный в круглые скобки и вложенный в предложение WITH, SELECT, FROM, WHERE или HAVING основного (внешнего) запроса SELECT или других запросов, использующих эти предложения.

Существуют простые и соотнесенные (связанные) подзапросы. В предложениях SELECT, WHERE и HAVING могут использоваться и простые, и соотнесенные подзапросы, а в предложении FROM только простые. В предложение WHERE (или HAVING) как простые, так и соотнесенные подзапросы включаются с помощью предикатов IN, EXISTS или одной из операций сравнения (=, <, >, <=, >=, <>). Выражения, содержащие подзапрос в предложениях WHERE или HAVING, используются наиболее часто.

Простым подзапросом называется такой, результат которого не зависит от внешнего запроса.

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

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

Подзапрос является связанным, когда в нем (в предложениях WHERE, HAVING) указан столбец таблицы внешнего запроса. Такое обращение к столбцам внешнего запроса называется внешней ссылкой. В связанных подзапросах следует указывать полные имена столбцов, причем если во внешнем и вложенном запросах используется одна и та же таблица, то для столбцов должны быть заданы псевдонимы.

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

К подзапросам применяются следующие правила и ограничения:

– фраза ORDER BY не используется, хотя и может присутствовать во внешнем подзапросе;

– список в предложении SELECT состоит из имен отдельных столбцов или составленных из них выражений – за исключением случая, когда в подзапросе присутствует ключевое слово EXISTS;

– по умолчанию имена столбцов в подзапросе относятся к таблице, имя которой указано в предложении FROM. Однако допускается ссылка и на столбцы таблицы, указанной во фразе FROM внешнего запроса, для чего применяются квалифицированные имена столбцов (т.е. с указанием таблицы);

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

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

– скалярный подзапрос возвращает единственное значение;

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: