Базы данных

Вложенные операторы select


Часто запрос бывает настолько сложным, что его трудно поместить в форму единственного оператора select. В языке SQL допускается использование оператора select внутри предложения where другого оператора select. С помощью таких вложенных операторов select проще писать и воспринимать сложные запросы. Например, чтобы отобрать всех клиентов, бравших напрокат кассеты в декабре 1998 года, можно использовать следующий запрос:

select  from Customer where accountld in (select accountld from PreviousRental

where dateRented >=’dec/1/1998′ and dateRented<’1/1/99′)

Начиная с внутреннего запроса, сначала будут отобраны все прокаты кассет в декабре 1998 года (в таблице PreviousRental), а затем (в таблице Customer) будут отобраны клиенты, бравшие эти кассеты. Это эквивалентно соединению двух указанных таблиц с последующим отбором прокатов, состоявшихся в декабре 1998 года. Хороший оптимизатор запросов распознает эквивалентность запроса с вложенными операторами select и запроса соединения и может выработать аналогичную стратегию выполнения для обоих.

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

select  from Customer С where not exists (select  from PreviousRental P- where C.accountld = P.accountld)

Значение оператора not exists является истинным, когда его операнд представляет собой пустую таблицу. Использование сир позволяет упростить текст запроса путем введения локальных имен для таблиц. С служит для обозначения таблицы Customer, а Р — для обозначения таблицы PreviousRental. Один из возможных способов выполнения этого оператора select состоит в итерациях по строкам таблицы с. Для каждой строки таблицы С выполняется вложенный (внутренний) запрос с номером счета текущей строки таблицы С в качестве значения С.accountld. Если этот внутренний запрос не возвращает строк, то основной (внешний) запрос создает свою результирующую строку. Если же внутренний запрос возвращает хотя бы одну строку, основной запрос не создает результирующей строки для этого значения номера счета.

Во вложенных операторах select могут использоваться следующие операторы и ключевые слова: in, all, exists, unique, contains, union, not, intersect. Значение этих терминов достаточно очевидно. В хороших справочниках по языку SQL приводится много примеров их использования.

СУБД Microsoft Access не обладает возможностями создания вложенных запросов посредством QBL. Если поместить приведенный выше запрос в окно запроса в системе Access и перейти в режим design view (создать представление), получится конфигурация, представленная на 7.8. Вложенный оператор select показан в текстовой форме в качестве аргумента функции Exists во втором поле. Отрицание операции exists представлено словом False в поле Criteria.

Комментарии закрыты