Сравнение с результатом вложенного запроса

Использование вложенных запросов

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

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

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

Вложенные запросы играют важную роль в SQL по следующим причинам:

- оператор SQL с вложенным запросом зачастую является самым естественным способом выражения запроса, так как он лучше всего соответствует словесному описанию запроса;

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

- существуют запросы, которые нельзя сформулировать на SQL, не прибегая к помощи вложенных запросов.

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

Результаты вложенного запроса в предложении FROM используются как источник данных (исходная таблица) для основного запроса. Пример такого запроса рассматривался в п. 13.7.2.

В данном подразделе рассмотрим вложенные запросы в предложениях WHERE и HAVING.

Вложенные запросы в предложении WHERE помогают отбирать из таблицы результатов запроса отдельные строки, а в предложении HAVING – группы строк.

Вложенный запрос хотя и сохраняет структуру оператора SELECT, но при этом обладает рядом отличительных особенностей.

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

Таблица результатов вложенного запроса в предложениях WHERE и HAVING может содержать только один столбец.

Во вложенный запрос не может входить предложение ORDER BY.

Во вложенном запросе можно использовать имена столбцов таблиц главного запроса (внешние ссылки). Такие вложенные запросы называются связанными.

 

Вложенный запрос в предложении WHERE или HAVING может использоваться в следующих типах условий отбора:

- сравнение с результатом вложенного запроса;

- проверка на принадлежность результатам вложенного запроса;

- проверка на существование;

- многократное сравнение.

 

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

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

Синтаксис:

<выражение> <операция сравнения> (<вложенный запрос>)

 

Пример 43. Вывести информацию (тип вызова, время, длительность, стоимость) о самом продолжительном телефонном разговоре.

SELECT T.NAZV, V.VREMYA, V.DLIT, V.STOIM

FROM VYZOVY V, TIPY_VYZ T

WHERE (T.ID=V.TIP_ID) AND

V.DLIT=(SELECT MAX(DLIT) FROM VYZOVY)

 

Пример 44. Вывести список контактов, чей возраст больше среднего.

SELECT K.NAME1, K.VOZRAST

FROM KONTAKTY K

WHERE K.VOZRAST>(SELECT AVG(VOZRAST) FROM KONTAKTY)

 

Пример 45. Каких вызовов было больше, чем пропущенных.

SELECT T.NAZV, COUNT(*)

FROM TIPY_VYZ T, VYZOVY V

WHERE T.ID=V.TIP_ID

GROUP BY T.ID, T.NAZV

HAVING COUNT(*)>(SELECT COUNT(*)

FROM TIPY_VYZ T1, VYZOVY V1

WHERE (T1.ID=V1.TIP_ID) AND (T1.NAZV='Пропущенный'))