
Подзапрос - это команда SELECT, вложенная в предложение другой команды SQL (например, SELECT, CREATE, INSERT и т.д.). Механизм подзапросов является мощным и гибким инструментом языка SQL, позволяющим создавать сложные команды при работе с данными. Это может быть удобно для выборки строк таблицы по условию, зависящему от данных в самой таблице.
Структура подзапроса представлена на рисунке.

Подзапросы очень полезны при написании команд SELECT для выборки значений по некоторому условию, значения операндов которого заранее неизвестны. Подзапросы можно использовать в разных предложениях команд SQL:
Синтаксис запроса с подзапросом:
|
где
| оператор | Оператор сравнения (например, >, = или IN). |
По количеству возвращаемых строк, удовлетворяющих условию запроса, подзапросы разделяют на однострочные и многострочные. В однострочных подзапросах в качестве операторов сравнения могут быть использованы (>,=,>=,<,<>,<=). Для многострочных запросов правильным будет использование только оператора IN (NOT IN).
Правила оформления подзапроса следующие:
Как обрабатываются вложенные подзапросы?
Вложенная команда SELECT выполняется первой. Результат передается в условие главного запроса.
Пример: Выборка фамилий и должностей сотрудников того же отдела, что у Biri.

Команда SELECT для этого примера будет выглядеть следующим образом:

Однострочные подзапросы.
Однострочный подзапрос возвращает из вложенной команды SELECT только одну строку. В подзапросах этого типа используется однострочный оператор сравнения.
Пример: Вывод фамилий сотрудников, имеющих такую же должность, как Smith.

| LAST_NAME ------------------------------------------- |
| Maduro |
| Smith |
| Nozaki |
| Patel |
| Newman |
| Markarian |
| Chang |
| Patel |
| Danes |
| Schwartz |
|
10 rows selected. |
Групповая функция в подзапросе.
Можно выводить данные из основного запроса, используя групповую функцию в подзапросе для возврата одной строки. Подзапрос заключается в скобки и помещается после оператора сравнения.
Пример: Вывод фамилии, должности и зарплаты всех служащих с зарплатой ниже средней.

| 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 |
|
12 rows selected. |
Групповая функция 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 |
| ... |
Здесь необходимо использовать многострочный оператор сравнения (IN), т.к. подзапрос возвращает список значений.
Предложение HAVING с подзапросами.
Подзапросы можно использовать не только в предложении WHERE, но и в предложении HAVING. При этом сервер выполняет подзапросы первыми и результаты возвращает в предложение HAVING главного запроса.
Пример: Вывод всех отделов, где средняя зарплата выше, чем в отделе 32.

| DEPT_ID ------------------------------ |
AVG(SALARY) ------------------------------ |
| 33 | 1515 |
| 50 | 2025 |
| ... |
Пример: Поиск должности чья средняя заработная плата больше средней заработной платы по всем сотрудникам.

| TITLE ----------------------------------- |
AVG(salary) ------------------------------- |
| Stock Cleark | 955 |
![]() |
Для закрепления материала рекомендуется выполнить Практическое задание 7. |
