Вложенные запросы на чтение

В языке SQL существует понятие вложенного запроса. Механизм вложенных запросов позволяет использовать результат одного запроса в качестве составной части другого запроса.

Возможность применения одного запроса внутри другого и была причиной появления слова «структурированный» в названии языка SQL. Понятие вложенного запроса играет важную роль в SQL но трем причинам:

  • 1) оператор языка SQL с вложенным запросом зачастую является самым естественным способом выражения запроса, так как он лучше всего соответствует словесному описанию запроса;
  • 2) вложенные запросы облегчают написание операторов SELECT, поскольку они позволяют разбивать запросы на части (т.е. на запрос и вложенные запросы), а затем складывать эти части вместе;
  • 3) существуют запросы, которые нельзя сформулировать, не прибегая к помощи вложенных запросов.

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

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

SELECT N0M,FI0 FROM PERSON

WHERE SUMD

К сожалению, в таком виде оператор SELECT не может быть выполнен из-за некорректного условия поиска, содержащего величину S. Однако эту величину можно легко вычислить таким оператором:

SELECT МАХ(MONEY) FROM PROFIT

Этот оператор следует использовать вместо величины S в качестве вложенного запроса:

SELECT NOM,FIO FROM PERSON

WHERE SUMD < (SELECT MAX(MONEY) FROM PROFIT)

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

Вложенные SQL-запросы являются частью предложения WHERE или HAVING. В предложении WHERE они помогают отбирать отдельные строки, а в предложении HAVING — группы строк.

Вложенный запрос — это оператор SELECT, заключенный в круглые скобки. Однако между вложенным запросом и оператором SELECT имеется ряд отличий.

  • 1. Таблица результатов вложенного запроса всегда состоит из одного столбца, т.е. список возвращаемых столбцов должен иметь только один элемент.
  • 2. Во вложенный запрос не может входить предложение ORDER BY.
  • 3. Вложенный запрос не может быть запросом на объединение нескольких различных операторов SELECT; допускается использование только одного оператора SELECT.
  • 4. Имена столбцов, используемые во вложенном запросе, могут являться ссылками на столбцы таблиц главного (внешнего) запроса.

Чтобы проиллюстрировать последнее из перечисленных отличий, рассмотрим следующий запрос: определить адреса квартир, жители которых не могут оплачивать коммунальные услуги. Условно принимаем, что коммунальные услуги оплачиваются из расчета 60 руб. за квадратный метр (в год).

Таблица результатов формируется оператором:

SELECT ADR FROM FLAT

WHERE SKV*60>(SELECT SUM(SUMD) FROM PERSON WHERE FLAT.ADR = PERSON.ADR)

Столбец (или поле) FLAT.ADR во вложенном запросе является примером внешней ссылки. Внешняя ссылка представляет собой имя столбца, принадлежащего таблице, указанной в предложении FROM главного запроса, и не входящего ни в одну из таблиц, перечисленных в предложении FROM вложенного запроса.

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

Процедура выполнения связанного подзапроса состоит из следующих шагов:

  • 1) выбрать строку из таблицы, имя которой указано в главном запросе; эту текущую строку назовем строкой- кандидатом (в примере это строка таблицы FLAT с полем ADR);
  • 2) выполнить вложенный запрос с учетом значений, содержащихся в текущей строке-кандидате (в примере это значение поля FLAT.ADR, в соответствии с которым из таблицы PERSON выбираются сведения о жителях конкретной квартиры и вычисляется сумма их доходов);
  • 3) вычислить условие поиска главного запроса с учетом результатов вложенного запроса, выполненного на шаге 2; если вычислено значение TRUE, то текущая строка-кандидат включается в таблицу результатов;
  • 4) повторять шаги 1—3 для следующей строки-кандидата, пока не будут проверены все строки таблицы, указанной в главном запросе.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >