Назад    Оглавление    Далее

Подзапросы

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

Структура подзапроса представлена на рисунке.

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

Синтаксис запроса с подзапросом:

SELECT список_выбора
FROM таблица
WHERE выражение оператор (SELECT список_выбора FROM таблица);

где

оператор Оператор сравнения (например, >, = или IN).

По количеству возвращаемых строк, удовлетворяющих условию запроса, подзапросы разделяют на однострочные и многострочные. В однострочных подзапросах в качестве операторов сравнения могут быть использованы (>,=,>=,<,<>,<=). Для многострочных запросов правильным будет использование только оператора IN (NOT IN).

Правила оформления подзапроса следующие:

Как обрабатываются вложенные подзапросы?

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

Пример: Выборка фамилий и должностей сотрудников того же отдела, что у Biri.

  1. Первой выполняется команда SELECT вложенного блока запроса. Результат -- 43.
  2. Далее обрабатывается главный блок запроса. Результат подзапроса используется при этом для вычисления условия поиска.

Команда 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.


Назад    Оглавление    Далее