Подзапрос – это команда SELECT, вложенная в другую
команду SQL (например, SELECT,
CREATE, INSERT и т.д.).
Механизм подзапросов является мощным и гибким инструментом языка
SQL, позволяющим создавать сложные команды при работе
с данными. Это может быть удобно для выборки строк таблицы по условию,
зависящему от данных в самой таблице. Структура подзапроса представлена на
рисунке.
Рисунок 8. Структура подзапроса
Подзапросы очень полезны при написании команд SELECT
для выборки значений по некоторому условию, значения операндов которого заранее
неизвестны. Подзапросы можно использовать в разных предложениях команд
SQL:
предложение WHERE;
предложение HAVING;
предложение FROM команды SELECT или
DELETE.
Синтаксис запроса с подзапросом:
SELECT
Список_выбора
FROM
Таблица
WHERE
выражение оператор
(SELECT
Список_выбора
FROM
Таблица
……….);
где
оператор
Оператор сравнения (например, >, = и т.д.) или оператор
IN.
По количеству возвращаемых строк, удовлетворяющих условию запроса, подзапросы
разделяют на однострочные и многострочные. В однострочных
подзапросах в качестве операторов сравнения могут быть использованы операторы:
“>”, “=”, “>=”, “<”, “<>”, “<=”. Для многострочных запросов правильным
будет использование только оператора IN (NOT
IN).
Правила оформления подзапроса следующие:
подзапрос должен быть заключен в
круглые скобки;
подзапрос должен находиться
справа от оператора сравнения в логическом выражении;
в подзапросе нельзя использовать
предложениеORDER BY.
Как обрабатываются вложенные подзапросы?
Вложенная команда SELECT выполняется первой.
Результат передается в условие главного запроса.
Пример. Выборка фамилий и должностей сотрудников,
работающих в том же отделе, где работает сотрудник по фамилии “Biri”.
Диаграмма выполнения этого запроса следующая:
Первой выполняется
команда SELECT вложенного блока запроса. Результат – 43.
Далее
обрабатывается главный блок запроса. Результат подзапроса используется при этом
для вычисления условия поиска.
Однострочные подзапросы
Однострочный подзапрос возвращает из вложенной команды
SELECT только одну строку. В подзапросах этого типа используется
однострочный оператор сравнения.
Пример. Вывод фамилий сотрудников, имеющих такую же
должность, как Smith.
LAST_NAME
TITLE
Maduro
Stock Clerk
Smith
Stock Clerk
Nozaki
Stock Clerk
Patel
Stock Clerk
Newman
Stock Clerk
Markarian
Stock Clerk
Chang
Stock Clerk
Patel
Stock Clerk
Danes
Stock Clerk
Schwartz
Stock Clerk
Групповая функция в подзапросе
Можно выводить данные из основного запроса, используя групповую функцию в
подзапросе для возврата одной строки. Подзапрос заключается в скобки и
помещается после оператора сравнения.
Пример.Вывод фамилии, должности и зарплаты всех
служащих с зарплатой ниже средней.
LAST NAME
TITLE
SALARY
Urguhart
Warehouse Manager
1200
Menchu
Warehouse Manager
1250
Biri
Warehouse Manager
1100
Smith
Stock Clerk
940
Nozaki
Stock Clerk
1200
Patel
Stock Clerk
795
Newman
Stock Clerk
750
Markarian
Stock Clerk
850
Chang
Stock Clerk
800
Patel
Stock Clerk
795
Dancs
Stock Clerk
860
Schwartz
Stock Clerk
1100
Групповая функция AVG возвращает единственное
значение.
Многострочные подзапросы
Подзапросы, возвращающие более одной строки, называются многострочными.
В них следует использовать многострочный оператор сравненияIN, т.к. этот оператор предоставляет возможность
выбора из списка значений.
Пример.Вывод списка служащих, приписанных к
отделу “Finance” или региону 2.
LAST_NAME
FIRST_NAME
TITLE
Quick-To-See
Mark
VP, Finance
Menchu
Roberta
Warehouse Manager
Giljum
Henry
Sales Representative
Nozaki
Akira
Stock Clerk
Patel
Vikram
Stock Clerk
Предложение HAVING с подзапросами
Подзапросы можно использовать не только в предложении
WHERE, но и в предложении HAVING. При этом подзапросы выполняются первыми и
результаты возвращаются в предложение HAVING
главного запроса.
Пример.Вывод всех отделов, где средняя зарплата выше,
чем в отделе 32.
DEPT_ID
AVG(SALARY)
33
1515
50
2025
Пример.Поиск должности, чья средняя заработная плата
больше средней по всем сотрудникам.