Подзапрос - это команда 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. |