double arrow

Проверка на принадлежность результатам вложенного запроса (IN)

ВНЕШНИЕ ССЫЛКИ

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

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

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

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

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

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

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

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

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

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

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

В приведенном операторе select вложенный запрос играет следующую роль: он вычисляет сумму плановых объемов продаж для служащих, работающих в одном офисе, а именно в том, который в данный момент проверяется предложением where главного запроса. Вложенный запрос выполняет просмотр таблицы salesreps. Но обратите внимание: столбец office в предложении where вложенного запроса является столбцом не таблицы salesreps, а таблицы offices, которая входит в главный запрос. Во время последовательной проверки строк таблицы offices значение столбца office в текущей строке этой таблицы используется для выполнения вложенного запроса.

Столбец office во вложенном запросе является примером внешней ссылки. Внешняя ссылка представляет собой имя столбца, не входящего ни в одну из таблиц, перечисленных в предложении from вложенного запроса, и принадлежащего таблице, указанной в предложении from главного запроса. Как показывает предыдущий пример, значение в столбце внешней ссылки берется из строки, проверяемой в настоящий момент главным запросом.

Условия поиска во вложенном запросе

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

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

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

• Проверка на существование. Проверяет наличие строк в таблице результатов вложенного запроса.

• Многократное сравнение. Сравнивает значение выражения с каждым из значений множества, возвращенного вложенным запросом.

Сравнение с результатом вложенного запроса (=,<>, <, <=, >, >=)

Сравнение с результатом вложенного запроса является модифицированной формой простого сравнения. Значение выражения сравнивается со значением, возвращенным вложенным запросом, и если условие сравнения выполняется, то проверка возвращает значение true. Эта проверка используется для сравнения значения из проверяемой строки с одним значением, возвращенным вложенным запросом, как показано в следующем примере:

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

В операции сравнения с результатом вложенного запроса можно использовать те же шесть операторов сравнения (=, О, <, <=, >, >=), что и при простом сравнении. Вложенный запрос, участвующий в операции сравнения, должен возвращать в качестве результата одну строку. Если результате вложенного запроса являются несколько строк, то сравнение не име смысла и SQL выдаст сообщение об ошибке. Если в результате выполнения вложенного запроса не будет получено ни одной строки или будет получено значение null, то операция сравнения возвращает null.

Обратите внимание на то, что вложенный запрос в операции сравнения может стоять только справа от оператора сравнения. Неравенство

А < (вложенный запрос) разрешается, а неравенство

(вложенный запрос) > А

недопустимо. Сказанное не ограничивает возможности операции сравнения, поскольку знак любого неравенства всегда можно "перевернуть" так, чтобы вложенный запрос оказался с правой стороны. Однако это говорит о том, что иногда требуется "переворачивать" логику словесного запроса так, чтобы он формально соответствовал действительному оператору SQL.

Проверка на принадлежность результата вложенного запроса (ключевое слово in) является видоизмененной формой простой проверки на членство в множестве. Одно значение сравнивается столбцом данных, возвращенных вложенным запросом, и если это значение равно одному из значений в столбце, проверка возвращает true, Дани проверка используется, когда необходимо сравнить значение из проверяема строки с множеством значений, возвращенных вложенным запросом, к показано в следующих примерах:

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


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



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