Главная Программы Учебное пособие Практикум Дополнительно
    Введение
  Глава 1
  Глава 2
  Глава 3
  Глава 4
  Глава 5
  Глава 6
  Глава 7
  Глава 8
  Задания
  Литература
  Приложение 1
  Приложение 2
  Приложение 3

Практикум

Глава 4. Выборка данных из базы данных

 

4.8. Подзапросы

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

 

 

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

 

 

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

 

Однострочные подзапросы

Однострочный подзапрос возвращает из вложенной команды 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

 

Пример. Поиск должности, чья средняя заработная плата больше средней по всем сотрудникам.

 

 

TITLE AVG(salary)
President 2550
Sales Representative 1480
VP, Administration 1550
VP, Finance 1450
VP, Operations 1450
VP, Sales 1400
6 rows selected.

 

Для закрепления материала рекомендуется выполнить Практическое занятие 6.

 

Назад